我已经研究了这个话题,并决定只在这里提问,因为我似乎找不到任何东西。我将在下面解释:
上下文:Flask 应用程序带有客户端填写并发送到服务器的表单。表单输入用于创建查询和返回数据。
我目前正在使用 SQLalchemy 从头开始构建查询。此时,我已成功连接到我现有的 Redshift 数据库并可以正确查询,但我不知道如何根据用户的表单输入动态构造一个简单的 Select x, y, z
语句。
主要问题是 Query()
无法接受 python 列列表。似乎您必须指定每一列,例如 table.c.column1
,这不适用于动态查询,因为在用户提交表单之前我不知道我想要什么列。
到目前为止我的 2 个想法:
- 遍历所有列名并使用
Query.add_columns(table.c['colname'])
- 使用
select([col1, col2, ...])
代替Query()
- 使用
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/