设置读取\u sql\u查询的参数时出错

2024-04-23 11:31:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在将字符串参数传递到pd.read\u sql\u查询时,如何修复此错误?使用Python2.7

table = 'mytable1'
query = (
        "SELECT * "
        "FROM ? "
    )
df = pd.read_sql_query(sql=query, con=conn, params=(table))

pandas.io.sql.DatabaseError: Execution failed on sql 'SELECT * FROM ? ': near "?": syntax error

我尝试用%%s替换?,但返回相同的错误

以下等式示例按预期工作:

query = (
        "SELECT * "
        "FROM mytable1 "
        "WHERE name = ? "
    )
df = pd.read_sql_query(sql=query, con=conn, params=('cat',))

请注意,参数中的逗号似乎是必需的,否则将返回此错误:Incorrect number of bindings supplied. The current statement uses 1, and there are 7 supplied.

我也试过解决我的问题,但没有运气。我知道我也可以用"FROM '{t}' ").format(t=table)来实现这一点,但我想了解如何使用Pandas的内置参数选项


Tags: fromdfreadsql参数错误tableparams
1条回答
网友
1楼 · 发布于 2024-04-23 11:31:13

问题在于params旨在替换值,而不是SQL关键字(来自选择,等等…)或表或列

不能这样指定表,必须使用字符串替换

query = (
        f"SELECT * "
        "FROM {table} "
    )

但是,要非常非常小心。这样做,而不是使用params,会使您面临一系列非常大的漏洞,SQL Injections

如果从外部来源获取表名,则不要这样做。

(哦,这种限制的可能原因是,除了出于安全原因的绝对必要性外,参数化查询还允许数据库引擎检查查询、查看索引、统计数据以及所有这些,并制定“执行计划”。然后,连续调用可以重用该执行计划并仅替换新变量。如果查询在访问哪些表和列方面发生更改,则无法执行此操作。)

相关问题 更多 >