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



我正试图将数据列表传递到MySQL数据库中,但对于我的生命,我无法找出我做错了什么,即使在互联网上搜索解决方案后,我决定在这里发布一个问题。

我可以连接到数据库没有问题,并发送简单的查询,如'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类型列表无法转换"的错误。当我将I包装在元组中时,也会得到相同的错误。

p。我将数据中的实际数据更改为占位符文本,但它应该工作相同。

对于你的第一个问题,你忘记给字符串加引号了。您应该加上'%s'(在%s周围加上引号),以便最终的查询将包含正确引用的字符串。

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

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

最新更新