我如何创建表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 可以用作 查询。