【问题标题】:Insert values into SQL column with mysql-python使用 mysql-python 将值插入 SQL 列
【发布时间】:2015-01-22 10:55:48
【问题描述】:

我正在尝试使用 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 示例的原始来源是 here

以下是我创建名为 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'")

有没有办法通过循环或直接将这些值插入到列中?

【问题讨论】:

  • 您可能希望修复此问题中的 DDL;如果表的定义没有TopAdd 的默认值,您的INSERT 查询将失败。由于您稍后添加了该列,因此它看起来不应该包含在原始 CREATE TABLE 语句中。

标签: mysql list python-2.7 sql-update mysql-python


【解决方案1】:

试试这个:

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

for i, j in enumerate(vals_list):

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

【讨论】:

  • 成功了!我不明白你的方法是如何工作的,但我的不是。我试过这个:...% (str(self.vals_list[ijk]),int(ijk+1))) 但我仍然收到相同的错误消息。当我检查type() 时,我的方法得到&lt;type 'str'&gt; &lt;type 'int'&gt;。使用你的方法,type() 给了我同样的结果。如果是这样的话,那么我的方法也应该有效。是不是我做错了什么?
  • 您是否在方法中更改了 TopAdd ='%s',在您的代码中是 TopAdd=%s
  • 谢谢。你的方法好多了。这回答了我的问题。
【解决方案2】:

这里有个问题:

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 函数为您安全地引用和转义参数。

进行该更改,并减去列名周围的引号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,但没有理由四处进行类型转换。 enumerate 是 documented 并给出了你已经想要的类型:

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

【讨论】:

  • 谢谢。尽管我将上述答案标记为已接受,但我的最终查询最终与上述答案和您的(第二个)非常相似 - 使用enumerate()。我发现这种方法比我的方法更容易理解。另外,感谢您纠正我对 self() 的使用 - 这对我来说是一个真正的误解,我可以简化代码。再次感谢。
猜你喜欢
  • 2018-07-08
  • 2019-01-08
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 1970-01-01
  • 1970-01-01
  • 2018-02-12
相关资源
最近更新 更多