python - 在 SqlAlchemy 中创建动态选择查询

标签 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() 仅加载表中的特定列以进行查询。不幸的是,除非我弄错了,否则似乎只适用于模型对象而不适用于反射表

这两个对我来说似乎都是倒退的,因为它们并没有真正有效地实现我的目标。

最佳答案

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

columns = request.args.getlist('columns')

然后你可以用一堆 column() 很容易地创建你的 select()构造:

stmt = select([column(c) for c in columns]).\
    select_from(some_table)

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

stmt = select([table.c[c] for c in columns])

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

results = db.session.execute(stmt).fetchall()

关于python - 在 SqlAlchemy 中创建动态选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46598276/

相关文章:

python - wxPython-Python :Serial port problems

python - py2exe 和消失的图标

python - 如何在 Flask sqlalchemy 中查询某段日期时间?

mysql - 将 MySQL 数据库连接到 Apache Superset

python - 如何让 Selenium WebDriver 使用 Socks 代理?

python - Sentry 不显示 tastypie 错误消息

python - Sqlalchemy:engine.execute() 的 postgresql paramstyle

python - 如何从sqlalchemy中的查询中获取列表

python - 在 sqlalchemy 中执行存储过程

python - 如何将图像数据从存储桶加载到AWS sagemaker笔记本?