【问题标题】:Programming error 1064 [closed]编程错误 1064 [关闭]
【发布时间】:2012-08-23 16:08:58
【问题描述】:

当我尝试使用以下 SQL 从 MySQL 数据库中获取一些结果时,

entries = db.query("SELECT * FROM users ORDER BY created_at DESC LIMIT %s", count)

我收到了这个错误:

默认错误处理程序中的文件“/Library/Python/2.7/site-packages/MySQLdb/connections.py”,第 36 行 引发错误类,错误值 ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行的 ''20'' 附近使用的正确语法")

我真的不知道我的 SQL 脚本出了什么问题。实际上,它在我以前的 PHP 版本的服务器中运行良好。为什么它在我的 Python 版本中不起作用?有什么与 Tornado 数据库包装器相关的特定内容吗?

我试图搜索整个互联网,但没有运气。 :(

【问题讨论】:

  • count = 20 在这种情况下。错误消息的实际值为 20。
  • 这对我有用(Python 2.7、Tornado 2.3、MySQLdb 1.2.3)
  • python 2.7.3, Tornado 2.3, MySQLdb 1.2.3

标签: python mysql mysql-error-1064 tornado


【解决方案1】:

您正在使用 '%s' 占位符,因此 count 值(显然是 20)被引用(这使您的查询以 LIMIT '20' 结束)。尝试改用'%d'

好吧,正如 Cole Maclean 所说,你不能在这里使用非'%s' 占位符;至少可以说,这使我的解决方案有点错误。

但原因还是一样:LIMIT 参数应该是一个数字,而不是“数字字符串”。但是引号以某种方式到达了最终查询: MySQL 错误消息显然是关于 LIMIT '20' 行。

这又可能是由 MySQLdb 库中的错误引起的,或者 - 可能是 - 给 count 变量的错误值:字符串 '20'(其中包含引号)而不是数字 20。我承认,这两种情况在我看来都不太可能。

你能用硬编码文字代替count 来测试这个查询吗?喜欢...

db.query("SELECT * FROM users ORDER BY created_at DESC LIMIT %s", 20)

【讨论】:

  • 虽然 %d 是合乎逻辑的,但 MySQLdb 仅适用于 %s 占位符。
  • @ColeMaclean 更新了答案。我对此有点困惑,因为错误消息指向此处的 LIMIT 问题。
  • 是的,也许你说 count 实际上是“'20'”是对的。
  • 非常感谢您的帮助!我修改了我的方法以删除“计数”参数。只需在方法体查询中放 20 即可。它通过没有任何错误。这真的很奇怪。我检查了许多其他地方,它说数据库查询只允许使用 %s,在这种情况下不使用 %d。
  • 检查您在哪里设置计数。让你拥有它作为 count = 20 或类似的东西。 Not count = '20' 这可能是问题
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
  • 2014-12-11
  • 2011-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多