python - 使用 sqlalchemy 的带有参数的 IN 条件
问题描述
我需要一些帮助来使用简单的 Web 表单使用 SQLalchemy 和 SQL 服务器进行查询。
表单字段是datefrom、dateto和name,因此任何用户都可以根据自己的偏好过滤查询。
datefrom,dateto从 datepicker 中选择,它们可以留空以扩大查询范围。
name是一个多选项目列表:您可以选择一个、两个或无。如果没有选择,我想查询数据库中的所有名称(超过 20 个)。
SQL 查询文件是外部的并在脚本中加载。
蟒蛇脚本:
params = {'date_from': date_from,
'date_to': date_to,
'names': names
}
with engine.connect() as con:
with open(query_file, 'r') as query:
sql = sqlalchemy.text(query.read())
for key in params.keys():
if type(params[key]) == list:
sql = sql.bindparams(bindparam(key, expanding=True))
rs = con.execute(sql, params)
results = pd.DataFrame(rs.fetchall(), columns=query_columns)
sql脚本:
WHERE (
(date >= :datefrom OR :datefrom IS NULL)
AND
(date <= :dateto OR :dateto IS NULL)
)
AND (user IN :name OR :name IS NULL)
问题在于 IN 条件。我们有3个案例。
案例 1. :name = ['Mark']
CASE 2. :name = None(SQLalchemy 将其更改为 NULL)
案例 3. :name = ['Mark','John']
此解决方案的问题在于第三种情况,因为 SQLalchemy 将查询绑定到(?,?) IS NULL会产生错误。
我试图在 SQL 查询中以某种方式解决这个问题,但没有成功。使用合并,CAST。我还使用了一个标志,并尝试使用 SQL 语句中的优先顺序来缩短某些内容。
另一种尝试是将列表转换为字符串并将其用作参数。
我还没有尝试的唯一方法是根据用户输入动态添加这个 WHERE 子句,并避免检查 SQL 查询中的内容。就像是:
sql += " AND 用户在 :name"
谢谢!
解决方案
推荐阅读
- odoo - 如何将发票的总价格转换为 odoo 11 中的字母?
- swift - 在 iPhone X 及更高版本的 UIScrollView 中没有 UIImage 的全屏
- planning - PDDL 中的变量可以是多于一种类型?
- c - 读者和作家——作家饥饿
- vue.js - 如何从 JSON 中获取数据?我的 v-for 循环不工作
- docker - Docker --ssh 标志 - 主机密钥验证失败
- python - 当我尝试将十进制数转换为二进制时,为什么我的代码会产生错误的输出?
- ruby-on-rails - 当外键可以引用两个不同列中的任何一个时,如何编写belongs_to关联?
- amazon-web-services - AWS SNS/SQS:如何为每个 SQS 订阅者准确发送一条 SNS 消息?
- r - 使用每日观察预测医院床位需求