【问题标题】:Sqlalchemy ORM query fails if actual column name is in lower case如果实际列名是小写,则 Sqlalchemy ORM 查询失败
【发布时间】:2021-08-24 20:47:47
【问题描述】:

我有一个简单的 python3 脚本,它使用 Sqlalchemy orm(1.3) 查询 Employee 表,底层数据库是 Sqlite3。如果 Employee 表的列名称为“Id”,则此脚本可以正常工作,但如果列名称为“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:类型对象'Employee'没有属性'Id'

【问题讨论】:

    标签: sqlite sqlalchemy


    【解决方案1】:

    有关通用解决方案,请参阅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']))
    

    【讨论】:

      【解决方案2】:

      sqlite 表和列名不区分大小写,这就是您遇到此问题的原因。这不是 sqlalchemy 问题,而是 sqlite 问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-03
        • 2020-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多