我正在尝试在SQLAlchemy(python)中运行过滤器查询,并且我遇到了列名称中区分大小写的问题。
模型类是从模式中自动生成的,如下所示:
Base = declarative_base()
engine = create_engine('postgresql://user:pass@localhost: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)列“mycasesensitiveattribute”不存在 第3行:在哪里myCaseSensitiveAttribute = 1
其他所有功能都可以使用区分大小写。它只是导致问题的过滤器。有没有办法强制它引用列名而不显式定义模型类中的每个属性(在这种情况下不实用),或者基于变量值过滤结果集的其他一些工作方法?
谢谢你的时间!
答案 0 :(得分:1)
如果您使用的是文字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:tiger@localhost: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()
)