【问题标题】:Why pandas.read_sql returns an empty DataFrame?为什么 pandas.read_sql 返回一个空的 DataFrame?
【发布时间】:2018-04-05 11:07:25
【问题描述】:

我正在尝试从数据库中检索数据并保存到 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() 从数据库中检索数据。

【问题讨论】:

    标签: python-3.x pandas pandas-datareader


    【解决方案1】:

    原因是生成该 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 注入示例:

    【讨论】:

    • 谢谢!脚本不起作用的原因是查询中的空格。但是,感谢您指出 SQL 注入和有趣的图片(虽然我没有明白图片的重点)。
    • @Pandaaaaaaa,关于图片 - 如果没有针对 SQL 注入的保护,它可能可能删除包含车牌的整个数据库。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-19
    • 2022-12-03
    • 2012-08-26
    • 2019-11-06
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多