如果实际列名是小写,则 Sqlalchemy ORM 查询失败

Sqlalchemy ORM query fails if actual column name is in lower case

我有一个简单的 python3 脚本,它使用 Sqlalchemy 查询 Employee table orm(1.3),底层数据库是Sqlite3。如果 Employee table 具有名称为“Id”的列,则此脚本工作正常,但如果列名称为“[=23”,则脚本会失败=]id”(小写)。无论列名是“Id”还是“id”,有没有办法让这个脚本工作。基本上我想让这个脚本工作而不考虑列名区分大小写。

代码如下:

from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm.query import Query
from sqlalchemy.ext.automap import automap_base
import sys


engine = create_engine(sys.argv[1])
metadata = MetaData(engine)
base = automap_base()
base.prepare(engine, reflect=True)
employee_table = base.classes["Employee"]
query = Query(employee_table).filter(employee_table.Id.in_(['100', '200']))

我从命令行 运行 python3 test.py sqlite:///temp.db

这是我收到的错误:

AttributeError: type object 'Employee' has no attribute 'Id'

sqlite table 和列名不区分大小写,所以这就是您 运行 遇到这个问题的原因。这不是 sqlalchemy 问题,而是 sqlite 问题。

有关通用解决方案,请参阅 Intercepting Column Definitions 文档页面。

不太优雅,但 if 语句也可以:

if hasattr(employee_table, 'Id'):
   id_attr = getattr(employee_table, 'Id')
elif hasattr(employee_table, 'id'):
   id_attr = getattr(employee_table, 'id')
else:
   raise ...

query = Query(employee_table).filter(id_attr.in_(['100', '200']))