如何在sql炼金术过滤器中从字符串变量动态地给出列名?

ani*_*ils 30 python sqlalchemy

我想在sql炼金术过滤器中创建查询,但是在变量/变量中指定的列是(动态的).

原始查询:

db_session.query(Notice).filter(Notice.subject.like("%" +query+ "%"))
Run Code Online (Sandbox Code Playgroud)

我想做这样的查询:

col_name='subject'
db_session.query(Notice).filter(Notice.col_name.like("%" +query+ "%"))
col_name='status'
status=0
db_session.query(Notice).filter(Notice.col_name != 1)
Run Code Online (Sandbox Code Playgroud)

van*_*van 50

只需使用getattr标准python库函数按名称获取属性:

col_name = 'subject'
db_session.query(Notice).filter(getattr(Notice, col_name).like("%" + query + "%"))
Run Code Online (Sandbox Code Playgroud)


Der*_*會功夫 8

在较新的 sqlalchemy 版本中,应该这样做:

Notice.__table__.c[col_name]
Run Code Online (Sandbox Code Playgroud)

所以:

(db_session
    .query(Notice)
    .filter(Notice.__table__.c[col_name].like("%" + query + "%")
)
Run Code Online (Sandbox Code Playgroud)

  • 我不相信这里的任何内容都特定于较新的 SQLAlchemy 版本。您提出这种说法的依据是什么?旧版本中不存在这里的哪些功能? (3认同)
  • 这与版本无关。您正在从底层的“表”访问“列”对象,而不是映射类的检测属性。如果映射属性的名称与列不同,这甚至可能不起作用。 (3认同)
  • 请注意,您可以使用“.columns”代替“.c”,这可能更清晰。 (2认同)