【问题标题】:Constructing an SQL query with a list of variable length with sqlalchemy and pandas in python在 python 中使用 sqlalchemy 和 pandas 构建具有可变长度列表的 SQL 查询
【发布时间】:2016-11-05 06:41:23
【问题描述】:

我想构造一个带有IN 运算符的SQL 语句,该运算符适用于任意长度的列表。我正在使用 python、pandas 和 sqlalchemy。

例如,如果我要执行的查询是

SELECT * FROM users WHERE age IN (25, 26, 27)"

我试过了:

import pandas as pd
from sqlalchemy.sql import text

ages = (25, 26, 27)
query = text("SELECT * FROM users WHERE age IN (:x)")
df = pd.read_sql_query(query, conn, params={"x":ages})

但这会导致错误。如何正确构建查询?我希望解决方案在IN 运算符的列表中只有一个值的情况下工作,即ages = tuple(25)

【问题讨论】:

  • 您可能想试试this。 PS 它不适用于我的 SQLite,目前我无法将其与其他 SQL 数据库进行对比...

标签: python sql pandas sqlalchemy


【解决方案1】:

考虑为占位符构建动态 SQL 字符串,并为参数使用字典理解构建动态字典。下面假设您的 RDMS 是带有冒号命名参数的 SQLite:

import pandas as pd
from sqlalchemy.sql import text

ages = (25, 26, 27)
placeholders = ', '.join([':param'+str(i) for i in range(len(ages))])
paramdict = {'param'+str(i): ages[i] for i in range(len(ages))}

query = text("SELECT * FROM users WHERE age IN ({})".format(placeholders))
# SELECT * FROM users WHERE age IN (:param0, :param1, :param2)

df = pd.read_sql_query(query, conn, params=paramdict)

【讨论】:

    【解决方案2】:

    一种解决方案是使用python的字符串join()方法。

    示例如下:

    import pandas as pd
    from sqlalchemy.sql import text
    
    ages = (25, 26, 27)
    ages = (str(n) for n in ages)
    ages = ','.join(ages)
    query = text("SELECT * FROM users WHERE age IN (:x)")
    df = pd.read_sql_query(query, conn, params={"x":ages})
    

    【讨论】:

    • 这似乎不对。结果是WHERE age IN ('25, 26, 27') 而不是WHERE age IN (25, 26, 27)
    猜你喜欢
    • 2019-10-28
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    • 2015-07-15
    相关资源
    最近更新 更多