如何正确地将列表传递到 python 中的 MySQL 查询 3

how to correctly pass a list into a MySQL query in python 3

我正在尝试将数据列表传递到 MySQL 数据库中,但我终究无法弄清楚自己做错了什么,即使在互联网上搜索解决方案之后也是如此我决定在这里 post 提问。

我可以毫无问题地连接到数据库,并且发送像 'SHOW TABLES' 这样的简单查询非常有效,但是当试图将列表的内容传递到 MySQL 时却不起作用.此处的代码与我开始工作时一样接近,但由于电子邮件地址,我收到错误消息。

错误是:“您的 SQL 语法有错误...在 '@gmail.com、x123、False ...附近”

cursorObject = database.cursor()

#data is a list of lists
data = [['w0', 'firstName', lastName', example@gmail.com', 'x123', False, '12345', [], Europe, True], ...]     

for i in data:
   queryString = 'INSERT IGNORE INTO `database` (foo1, foo2, foo3, foo4, foo5, foo6,
   foo7, foo8, foo9, foo10) VALUES(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)'  % (i[0], i[1], 
   i[2], i[3], i[4], i[5], i[6], i[7], i[8], i[9])

   cursorObject.execute(queryString)

您知道电子邮件中的“@”为什么会导致错误吗?而且,我不知道我是否不小心让自己容易受到 sql 注射。我尝试用

之类的格式格式化代码
stringData = ', '.join(['%'] * len(i))

然后在查询中添加 i 作为第二个参数,但随后我只收到 'Python type list cannot be converted' 错误。当我将 i 包装在一个元组中时,我得到了同样的错误。

ps。我将数据中的真实数据更改为占位符文本,但它应该可以正常工作。

对于您的第一个问题,您忘记了在字符串中添加引号。您应该放置“%s”(在 %s 两边加上引号),以便最终查询包含正确引用的字符串。

对于你的第二个问题,(a) 使用 join 而不是 format 并不能保护你免受 SQL 注入,并且 (b) 你没有包含实际数据...

但真正的答案是完全避免构建带有嵌入参数值的字符串,而是使用准备好的语句。您没有说您使用哪个 python 模块进行连接,请查看文档。 在 MySql Connector/Python 的情况下,您可以使用 statement.execute(queryString, (tuple with the data to insert)) 如此处所示:https://dev.mysql.com/doc/connector-python/en/connector-python-example-cursor-select.html