在 SqlAlchemy 中创建动态选择查询

use*_*486 5 python sqlalchemy

我已经研究过这个话题,并决定在这里问,因为我似乎找不到任何东西。我将在下面解释:

上下文:带有客户端填写并发布到服务器的表单的 Flask 应用程序。表单输入用于创建查询和返回数据。

我目前正在使用 SQLalchemy 从头开始​​构建查询。至此,我已经成功连接到我现有的 Redshift 数据库并且可以正常查询,但我无法弄清楚如何Select x, y, z根据用户的表单输入动态构建一个简单的语句。

主要问题是Query()无法接收列的python 列表。似乎您必须指定每个列,例如table.c.column1哪些列不适用于动态查询,因为在用户提交表单之前我不知道我想要哪些列。

到目前为止我的 2 个想法:

  1. 遍历所有列名并使用 Query.add_columns(table.c['colname'])
  2. 使用select([col1, col2, ...])代替Query()
  3. 用于load_columns()仅加载表中的特定列进行查询。不幸的是似乎只适用于模型对象而不适用于反射表,除非我弄错了

这两者在我看来都是倒退的,因为它们并没有真正有效地实现我的目标。

Ilj*_*ilä 5

SQLAlchemy 非常灵活,因此 1 和 2 都可以完成工作。如果您不需要 ORM 功能,那么也许#2 更自然。如果用户要传递列名称列表,例如

columns = request.args.getlist('columns')
Run Code Online (Sandbox Code Playgroud)

然后你可以select()使用一堆column()构造轻松地创建你的:

stmt = select([column(c) for c in columns]).\
    select_from(some_table)
Run Code Online (Sandbox Code Playgroud)

或者如果您手头有桌子,就像您在问题中暗示的那样:

stmt = select([table.c[c] for c in columns])
Run Code Online (Sandbox Code Playgroud)

然后剩下的就是执行你的语句:

results = db.session.execute(stmt).fetchall()
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用星号将可迭代对象解压为函数的位置参数:例如“db.session.query(*[table.c[c] for c in columns])”。 (3认同)