繁体   English   中英

使用mysql-python将值插入SQL列

[英]Insert values into SQL column with mysql-python

我正在尝试在Python 2.7中使用MySQLdb将值插入SQL表的列中。 我在将列表插入1列的命令中遇到问题。

我有一个名为“ name”的简单表,如下所示:

+--------+-----------+----------+--------+
| nameid | firstname | lastname | TopAdd |
+--------+-----------+----------+--------+
| 1      | Cookie    | Monster  |        |
| 2      | Guy       | Smiley   |        |
| 3      | Big       | Bird     |        |
| 4      | Oscar     | Grouch   |        |
| 5      | Alastair  | Cookie   |        |
+--------+-----------+----------+--------+

这是我创建表格的方式:

CREATE TABLE `name` (
  `nameid` int(11) NOT NULL AUTO_INCREMENT,
  `firstname` varchar(45) DEFAULT NULL,
  `lastname` varchar(45) DEFAULT NULL,
  `TopAdd` varchar(40) NOT NULL,
  PRIMARY KEY (`nameid`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8

这是我填充表格的方式:

INSERT INTO `test`.`name`
(`firstname`,`lastname`)
VALUES
("Cookie","Monster"),
("Guy","Smiley"),
("Big","Bird"),
("Oscar","Grouch"),
("Alastair","Cookie");

免责声明:以上MySQL示例的原始资源在这里

这是我创建名为TopAdd的新列的方法:

ALTER TABLE name ADD TopAdd VARCHAR(40) NOT NULL

现在,我有一个5个值的列表,我想将该列的值插入到TopAdd列中。 这是清单。

vals_list = ['aa','bb','cc','dd','ee']

这是我尝试过的(循环内的UPDATE语句):

vals = tuple(vals_list)
for self.ijk in range (0,len(self.vals)):
            self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1))

我收到以下错误消息:

Traceback (most recent call last):
  File "C:\Python27\mySQLdbClass.py", line 70, in <module>
    [Finished in 0.2s with exit code 1]main()
  File "C:\Python27\mySQLdbClass.py", line 66, in main
    db.mysqlconnect()
  File "C:\Python27\mySQLdbClass.py", line 22, in mysqlconnect
    self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1))
  File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 205, in execute
    self.errorhandler(self, exc, value)
  File "C:\Python27\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1054, "Unknown column 'aa' in 'field list'")

有没有一种方法可以将这些值通过循环或直接作为列表插入到列中?

尝试这个:

vals_list = ['aa','bb','cc','dd','ee']

对于i,enumerate(vals_list)中的j:

 self.cursor.execute(("UPDATE test.name SET TopAdd = '%s' WHERE nameid = %s" % (str(j),int(i+1))

一个问题在这里:

for self.ijk in range (0,len(self.vals)):

range函数正在创建一个整数列表(大概是列表[0, 1, 2, 3, 4] )。 for循环中遍历集合时,将集合中的每个后续项绑定到一个名称; 您不能将它们作为实例的属性进行访问 (在这里使用xrange似乎也很合适;请参阅xrange与range 。)因此, self引用是无意义的; 除此之外, ijk是一个可怕的整数值名称,不需要提供默认的起始值零。

for i in range(len(self.vals)):

这不仅使您的行更短(从而更易于阅读),而且使用i表示循环中的整数值是众所周知的约定。 现在我们遇到另一个问题:

self.cursor.execute ("UPDATE name SET TopAdd = %s WHERE 'nameid' = %s" % (self.vals[self.ijk],self.ijk+1))

您没有在此处正确地设置查询参数。 不要遵循此建议 ,这可能会解决您当前的错误,但会使您的代码最容易浪费调试时间,最糟糕的是SQL注入和/或数据完整性问题。 而是用逗号替换% ,以便execute函数安全地为您引用和转义参数。

进行此更改,然后减去列名nameid周围的引号:

query = "UPDATE name SET TopAdd = %s WHERE nameid = %s;"
for i in range(len(self.vals)):
    self.cursor.execute(query, (self.vals[i], i + 1))

应该能按预期工作。 您仍然可以按照其他答案的建议使用enumerate ,但是没有理由围绕所有可见的内容进行类型转换。 枚举已记录在案 ,并准确给出了您已经想要的类型:

for i, val in enumerate(self.vals):
    self.cursor.execute(query, (val, i + 1))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM