为什么不能在 pymysql 中用格式函数替换占位符?



我如何创建表mingyan.

CREATE TABLE `mingyan` (
`tag` varchar(10) DEFAULT NULL,
`cont` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

据说带有{}的字符串格式函数比占位符%更python化。
在我的拼命中将一些字段写入表mingyan.

self.cursor.execute("insert into mingyan(tag, cont) values (%s, %s)",(item['tag'],item['cont']))

它在我的拼凑中工作正常,现在我用字符串格式功能替换占位符方式。

self.cursor.execute("insert into mingyan(tag, cont) values ({},{})".format(item['tag'],item['cont']))

刮擦得到错误信息

pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; 

为什么不能在 pymysql 中用格式函数替换占位符?

在刮擦的垃圾桶中的项目。
项目含义在刮擦

简而言之:尽管使用"%s"作为占位符,但在cursor.execute中实现的参数替换与Python字符串格式不同;这就是为什么你会得到不同的结果。

数据库期望以特定方式引用查询参数 - 用单引号或双引号括起来,甚至是反引号。 Python 的 DBAPI 标准提供了参数替换功能,以自动化繁琐且容易出错的参数引用过程。

实现 DBAPI 标准的数据库驱动程序包会自动将正确的引用规则应用于查询参数。 例如,给定此代码

cursor.execute("""INSERT INTO mytable (foo, bar) VALUES (%s, %s);""", ('bar', None))   

驱动程序将使用此 VALUES 子句生成 sql:

VALUES ('bar', NULL)

观察

  • "bar"用引号引起来
  • None已转换为 NULL,并且未引起引号

使用字符串格式而不是 DBAPI 参数替换意味着您需要自己了解并应用这些规则,例如:

cursor.execute("""INSERT INTO mytable (foo) VALUES ('{}')""".format('bar'))

请注意格式占位符两边的引号。

MySQL的引用规则在回答这个问题时有详细的讨论。

我总是执行以下操作

self.cursor.execute("insert into mingyan(tag, cont) values (%(tag)s, %(cont)s)", 
{'tag': item['tag'], 'cont': item['cont']})

就像在文档中一样: https://pymysql.readthedocs.io/en/latest/modules/cursors.html#pymysql.cursors.Cursor.execute

如果 args 是列表或元组,则 %s 可以用作 查询。如果 args 是字典,则 %(name(s 可以用作 查询。

最新更新