为什么 pandas.read_sql returns 是一个空的 DataFrame?
Why pandas.read_sql returns an empty DataFrame?
我正在尝试从数据库中检索数据并保存到 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)
然而,returns,
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。我们不能参数化模式名称、table 名称、列、名称等
这是一个有趣的 SQL 注入示例:
我正在尝试从数据库中检索数据并保存到 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)
然而,returns,
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。我们不能参数化模式名称、table 名称、列、名称等
这是一个有趣的 SQL 注入示例: