2013-09-27 33 views
0

我想在SQLAlchemy(python)中运行筛选器查询,并且遇到列名称中区分大小写的问题。在SQLAlchemy筛选器中引用区分大小写的列名

模型类是从架构自动生成的,像这样:

Base = declarative_base() 
engine = create_engine('postgresql://user:[email protected]:5432/database') 
metadata = MetaData(bind=engine) 

class MyTable(Base): 
    __table__ = Table('my_table', metadata, autoload=True, quote=True) 

这里是我正在运行筛选器查询:

val = 1 
result = session.query(MyTable).filter("myCaseSensitiveAttribute=:myCaseSensitiveAttribute").params(myCaseSensitiveAttribute=val).all() 

这将导致错误:

sqlalchemy.exc.ProgrammingError: (ProgrammingError) column "mycasesensitiveattribute" does not exist LINE 3: WHERE myCaseSensitiveAttribute=1

其他一切正常工作与区分大小写。这只是导致问题的过滤器。有没有办法强制它引用列名称而没有明确定义模型类中的每个属性(在这种情况下不可行),或者其他一些基于变量值过滤结果集的工作方法?

谢谢你的时间!

回答

0

如果您使用的是文字SQL,则quote = True与发生的情况无关。当使用Table和Column对象而不是字符串来呈现SQL时,SQLAlchemy只负责引用。在绝大多数情况下,在绝大多数情况下使用它们时,quote = True仍然不需要,因为SQLAlchemy Core表达式构造会自动处理区分大小写的标识符。

实例,说明了几种形式的用法:

from sqlalchemy import * 
from sqlalchemy.orm import * 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

engine = create_engine('postgresql://scott:[email protected]:5432/test') 
conn = engine.connect() 
trans = conn.begin() 

conn.execute('create table "SomeCaseTable" ("SomeAttribute" varchar(20) primary key)') 
conn.execute('''insert into "SomeCaseTable" ("SomeAttribute") values ('some data')''') 
metadata = MetaData(bind=conn) 

class MyTable(Base): 
    __table__ = Table('SomeCaseTable', metadata, autoload=True) 

session = Session(conn) 
val = 'some data' 

# example 1: use SQL expressions 
print(
    session.query(MyTable). 
     filter(MyTable.SomeAttribute == val). 
     all() 
) 

# example 2: totally literal SQL - you need to quote manually 
print(
    session.query(MyTable). 
     filter('"SomeAttribute"=:some_attribute'). 
     params(some_attribute=val).all() 
) 

# example 3: bound param with SQL expressions 
print(
    session.query(MyTable). 
     filter(MyTable.SomeAttribute == bindparam('somevalue')). 
     params(somevalue=val).all() 
) 
+0

非常感谢您! – drkstr1

相关问题