使用 PyMySQL 时语法无效
Invalid syntax when using PyMySQL
我正在学习使用 Python 和 MySQL。相同的查询在 Mysql 和 PyMySQL 之间的工作方式不同。例如:在 MySQL 控制台中我有一个名为 "pages"
的 table
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 时应该始终使用占位符?
谢谢
首先,最后一个版本(参数化 查询)应该是最受欢迎的版本,因为您根本不需要在占位符周围加上引号,让数据库驱动程序自动计算出类型转换和引号。而且,这样您就可以免受 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")')
在 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)
我正在学习使用 Python 和 MySQL。相同的查询在 Mysql 和 PyMySQL 之间的工作方式不同。例如:在 MySQL 控制台中我有一个名为 "pages"
的 tableINSERT 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 时应该始终使用占位符?
谢谢
首先,最后一个版本(参数化 查询)应该是最受欢迎的版本,因为您根本不需要在占位符周围加上引号,让数据库驱动程序自动计算出类型转换和引号。而且,这样您就可以免受 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")')
在 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)