【问题标题】:MySQL statement in Python: Variables don't workPython中的MySQL语句:变量不起作用
【发布时间】:2011-08-31 06:20:29
【问题描述】:

当我尝试插入多个变量时,MySQL 和 Python 的 MySQLdb 出现问题。

我有一个包含三个字段的表 wordurl。第一个是 auto_increment ID,第二个和第三个应该保存这些值。第二个和第三个字段被命名为 word_id 和 url_id。

这是代码。

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)", (word_temp_id, url_temp_id))

当我尝试只插入一个值时,代码有效,两个无效。

错误信息:

(1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '),), (('2',),))' at line 1")

我还尝试了在语句周围加上三个勾号、带和不带括号的变量、不带字段名称和包含第一个 id 字段。我还尝试了 C-style-printf-stuff % (这不聪明!)。没有任何效果。

还有你们,stackoverflow 上光荣的人,你们是我最后的希望 :)

MySQL-Server 在 FreeBSD 8.2 上是 5.5.9。 OSX Lion 上的 Python 版本为 2.7:82508

提前致谢!

史蒂芬

更新:我使用 cursor.fetchall() 和 cursor.fetchone() 来获取 ID。也许这些信息很重要。

【问题讨论】:

  • 似乎 url_temp_id 为空
  • 不,不是。如果我注释掉该语句并用 print 替换它,它会显示 (((233L,),), ((3L,),)) 有两个值。但是括号太多了吧?

标签: python mysql mysql-python


【解决方案1】:

关于您的更新:

阿法伊克: fetchall() 返回一个包含元组的元组。里面的那些元组就是你从 fetchone() 得到的。你可以把它想象成这样

fetchall() = (fetchone(), fetchtwo(), ...)

而且 fetchone 还返回一个包含实际变量值的元组。这就是为什么你不能简单地插入 fetchall() 的返回值。

澄清一下:您粘贴的插入语句,在填写 max_price 的值时如下所示:

c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price < %s""", (5,))

所以第一个 %s 被替换为元组 (5) 的第一个元素。您的插入语句如下所示:

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)", (((233L,),), ((3L,),)))

我不能说得更清楚了。

【讨论】:

  • 我也试过了。这没用。如果我打印它们,它看起来像这样 (((233L,),), ((3L,),)) 括号和逗号有区别。也许这是错误?
  • 所有这些括号在那里做什么? o.O 你是怎么打印出来的?
  • 赞这个print(word_temp_id, url_temp_id)
  • 您不能用所有这些括号插入这些变量。你在哪里定义它们?请注意, fetchone() 返回一个元组 afaik 的元组。检查你在哪里为这些变量赋值并打印出你从 fetchone() 或其他什么得到的。
  • 我在 MySQLdb User's Guide 中发现我们需要一个元组,例如 c=db.cursor() max_price=5 c.execute("""SELECT spam, eggs, sausage FROM breakfast WHERE price &lt; %s""", (max_price,))
【解决方案2】:

你试过了吗:

cursor.execute("INSERT INTO wordurl (word_id, url_id) VALUES ('%s', '%s')" %(word_temp_id, url_temp_id))

这取决于您尝试插入的变量,但对于字符串,这是必需的。

注意区别:

>>> word_temp_id = "bla1"
>>> url_temp_id = "bla2"
>>> query = "INSERT INTO wordurl (word_id, url_id) VALUES (%s, %s)" %(word_temp_id, url_temp_id)
>>> print query
INSERT INTO wordurl (word_id, url_id) VALUES (bla1, bla2)
>>> query = "INSERT INTO wordurl (word_id, url_id) VALUES ('%s', '%s')" %(word_temp_id, url_temp_id)
>>> print query
INSERT INTO wordurl (word_id, url_id) VALUES ('bla1', 'bla2')

【讨论】:

  • 我试了一下,还是不行。错误仍然相同。我想我这里有一个元组错误
  • 你到底想插入什么?您可以粘贴 word_tem_id 和 url_temp_id 的示例吗?提供他们的类型?
  • 我尝试插入一个整数(在元组中?)我通过cursor.fetchall() 获取。如果我打印它,它看起来像(((233L,),), ((3L,),))
  • 看看示例 fetchall 的样子:query = "select user, timeborders_ptr_id from db cursor.execute( query ) timeborders = cursor.fetchall() for tuple in timeborders: user = tuple[0] timeborder = tuple[1] fetchall 结果将始终具有 (((user1,), (data1,)), ((user2,), (数据2,)))
  • 好的,谢谢。我知道了。我改成 fetchone(),从元组里面取值写到语句中。
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2018-01-20
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
相关资源
最近更新 更多