gpt4 book ai didi

python-3.x - 为什么 pandas.read_sql 返回一个空的 DataFrame?

转载 作者:行者123 更新时间:2023-12-03 19:48:36 26 4
gpt4 key购买 nike

我正在尝试从数据库中检索数据并保存到 pandas.DataFrame 中。
这是我的 Python 脚本,

conn = pyodbc.connect(sql_server)
query = '''SELECT a1, a2, a3
FROM ''' + dbschema + '''.SomeResults
WHERE FactorName = \' ''' + FactorName + ''' \' AND parametername = 'Param1' ORDER BY Factor1 '''
df = pd.read_sql(query, conn)
print(df)

然而,它返回,
Empty DataFrame
Columns: [a1, a2, a3]
Index: []

我很确定这不是 SQL 问题,因为我可以使用 conn.cursor() 从数据库中检索数据。

最佳答案

原因是生成该 SQL 的方式:

In [307]: dbschema = 'db'

In [308]: FactorName = 'Factor1'

In [309]: query = '''SELECT a1, a2, a3
...: FROM ''' + dbschema + '''.SomeResults
...: WHERE FactorName = \' ''' + FactorName + ''' \' AND parametername = 'Param1' ORDER BY Factor1 '''

In [310]: print(query)
SELECT a1, a2, a3
FROM db.SomeResults
WHERE FactorName = ' Factor1 ' AND parametername = 'Param1' ORDER BY Factor1

# NOTE: spaces ^ ^

你不应该以这种方式生成 SQL,因为它可能很危险(阅读 SQL injections)。

这将是一个正确的方法:
query = """
SELECT a1, a2, a3
FROM {}.SomeResults
WHERE FactorName = ? AND parametername = 'Param1'
ORDER BY Factor1
"""

df = pd.read_sql(query.format(dbschema), conn, params=(FactorName,))

注意:只有文字可以参数化。 IE。我们不能参数化模式名称、表名称、列、名称等。

这是一个有趣的 SQL 注入(inject)示例:

enter image description here

关于python-3.x - 为什么 pandas.read_sql 返回一个空的 DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46914125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com