2014-11-24 108 views
0

我想在Python 2.7中使用MySQLdb插入值到SQL表中的列。该命令将列表插入1列时遇到问题。插入值到SQL列与MySQL-python

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

+--------+-----------+----------+--------+ 
| 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示例的原始来源是here

这里是我创建了一个名为TopAdd的新列:

ALTER TABLE name ADD TopAdd VARCHAR(40) NOT NULL 

我现在有,我想插入列TopAdd作为列的值5个值的列表。这是清单。

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'") 

是否有插入这些值分成的方式带有循环的列或直接作为列表?

+0

你可能想修复这个问题的DDL;如果定义的表没有“TopAdd”的缺省值,那么你的INSERT查询将失败。由于稍后添加该列,它看起来应该不包含在原始的“CREATE TABLE”语句中。 – Air 2014-12-02 16:38:45

回答

1

试试这个:

vals_list = ['aa','bb','cc','dd','ee'] 
在历数

为I,J(vals_list):

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

工作正常!我不明白你的方法如何工作,但我的方法不是。我试过这个:'...%(str(self.vals_list [ijk]),int(ijk + 1)))'但我仍然收到相同的错误信息。当我检查'type()'时,我得到''为我的方法。使用你的方法,type()给了我相同的结果。如果是这样,那么我的方法也应该工作。有什么我做错了吗? – 2014-11-24 17:58:14

+1

您是否在您的代码中更改了TopAdd ='%s',在您的代码中是TopAdd =%s – 2014-11-25 13:01:21

+0

谢谢。你的方法好得多。这回答了我的问题。 – 2014-11-27 04:35:08

1

的一个问题是在这里:

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

range功能是创建一个列表(可能是列表[0, 1, 2, 3, 4])。在迭代for循环中的集合时,将集合中的每个连续项绑定到一个名称;您不需要将它们作为实例的属性进行访问。 (在这里使用xrange也是适当的;参见xrange vs range。)因此self参考是非感性的;除此之外,ijk对于整数值来说是一个糟糕的名字,并且不需要提供默认的初始值零。 KISS

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)) 

你没有正确这里参数化查询。不要遵循this advice,这可能会解决您目前的错误,但最糟的是,您的代码容易浪费调试时间,SQL injection和/或数据完整性问题。相反,用逗号替换%,以便execute函数可以为您安全地引用和转义参数。

随着这种变化,再减去在你列名引号,​​3210:

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,但是没有理由绕过所有可见的类型,枚举是documented,并给出了你已经想要的类型:

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

谢谢。尽管我将上面的答案标记为已接受,但我的最终查询最终与上面的答案和您的答案非常相似(第二个答案) - 使用'enumerate()'。我发现这种方法比我的理解要直观得多。另外,感谢您纠正我关于“self()”的使用 - 这是我的一个真正的误解,我可以简化代码的前进。再次感谢。 – 2014-11-27 04:34:35