gpt4 book ai didi

Python mysql.connector.errors。 %s 传递给带引号的 SQL 查询

转载 作者:行者123 更新时间:2023-11-29 05:18:27 25 4
gpt4 key购买 nike

我在 Python 中执行以下代码

cursor.execute('SHOW DATABASES;')
ans_dblist = cursor.fetchall()


for db_name in ans_dblist:
cursor.execute('SHOW TABLES FROM %s;', (db_name[0],))
ans_tbl = cursor.fetchall()
print ans_tbl

我得到这个错误:

Traceback (most recent call last):
File "./mysqlcon.py", line 12, in <module>
cursor.execute('SHOW TABLES FROM %s;', (db_name[0],))
File "/usr/lib/python2.6/site-packages/mysql/connector/cursor.py", line 507, in execute
self._handle_result(self._connection.cmd_query(stmt))
File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 722, in cmd_query
result = self._handle_result(self._send_cmd(ServerCmd.QUERY, query))
File "/usr/lib/python2.6/site-packages/mysql/connector/connection.py", line 640, in _handle_result
raise errors.get_exception(packet)
mysql.connector.errors.ProgrammingError: 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''information_schema'' at line 1

为什么 %s 被引号替换了? SQL 查询将查找基础'信息架构' 而不是信息架构(不带引号)。

最佳答案

MySQLPython 使用标准字符串格式标记(“%”)作为查询中的变量占位符这一事实可能会使事情变得困惑。

python 的 db-api 中的查询占位符用于where 子句和insertupdate 中使用的语句,并由 db-api 正确处理/转义/引用以避免 SQL 注入(inject)等。它们不应该用于表名或字段名。

因此,您在这里想要的是使用字符串格式构建查询:

sql =  'SHOW TABLES FROM %s;' % (db_name[0],)
cursor.execute(sql)

由于 db_name[0] 来自可信来源,因此这里没有安全问题。

关于Python mysql.connector.errors。 %s 传递给带引号的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388434/

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