首页 > 解决方案 > 使用 sqlalchemy 的带有参数的 IN 条件

问题描述

我需要一些帮助来使用简单的 Web 表单使用 SQLalchemy 和 SQL 服务器进行查询。

表单字段是datefromdatetoname,因此任何用户都可以根据自己的偏好过滤查询。

datefromdateto从 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会产生错误。

谢谢!

标签: pythonsqlsql-serversqlalchemysql-server-2005

解决方案


推荐阅读