【问题标题】:Invalid syntax when using PyMySQL使用 PyMySQL 时语法无效
【发布时间】:2017-08-21 19:06:38
【问题描述】:

我正在学习使用 Python 和 MySQL。相同的查询在 Mysql 和 PyMySQL 之间的工作方式不同。例如:在 MySQL 控制台中,我有一个名为“pages”的表

INSERT INTO pages (title,content) VALUES ("test title","test content")

这行得通。在 Python 中,我导入 PyMySQL,创建一个连接,然后输入 cursor = "cur"。当我跑步时:

cur.execute("INSERT INTO pages (title,content) VALUES ("test title","test content")")

.. 它会引发错误:语法无效。但是当我用占位符尝试这个时:

cur.execute("insert into pages (title,content) values (%s,%s)",("test title","test content"))

然后就可以了!所以我很困惑为什么相同的查询在 MySQL 中有效但在 python 中无效,这是否意味着我在使用 PyMySQL 时应该始终使用占位符?

谢谢

【问题讨论】:

  • 是的,您应该使用参数化查询。但是,如果您查看不起作用的语句,请考虑如何使用双引号。你基本上是在关闭你的字符串——在那里使用单引号,它也可以工作......
  • 是的,我明白了,这样的菜鸟错误

标签: mysql python-3.x pymysql


【解决方案1】:

首先,最后一个版本(参数化查询)应该是最受欢迎的,因为您根本不需要在占位符周围加上引号,让数据库驱动程序找出类型转换和引号自动。而且,这样您就可以免受SQL injection 攻击。

现在,回答您的问题。 如果你想在双引号内使用双引号,你需要转义它们:

cur.execute("INSERT INTO pages (title,content) VALUES (\"test title\", \"test content\")")

或者,外用单引号,内用双引号:

cur.execute('INSERT INTO pages (title,content) VALUES ("test title", "test content")')

【讨论】:

  • +1 用于 SQL 注入响应。查看bobby tables 了解如何防止 Python 中的 SQL 注入,因为 SQL 注入是一场噩梦。
  • 非常感谢,我现在明白了。
【解决方案2】:

在python中你不能通过这样做来连接字符串

a = "foo"
b = "bar"
"Foo bar" a " baz " b 

这就是你想要做的。相反,您必须执行"Foo bar" + a + " baz " + b。但是,如果您使用%s,则您使用的是格式化(基于C 的printf 函数),您可以使用逗号以这种方式格式化字符串

a = "foo"
b = "bar"
"Foo bar %s baz %s" % (a, b) 

【讨论】:

  • 感谢您的帮助,我知道我的问题是。
猜你喜欢
  • 2015-06-09
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 2012-10-04
  • 2013-04-25
  • 2016-05-05
  • 2018-03-18
相关资源
最近更新 更多