【问题标题】:Why can't replace placeholder with format function in pymysql?为什么在pymysql中不能用格式函数替换占位符?
【发布时间】:2023-04-06 07:44:01
【问题描述】:

我如何创建表mingyan

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

据说{}的字符串格式化函数比占位符%更pythonic。
在我的scrapy中将一些字段写入表mingyan

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

它在我的scrapy中运行良好,现在我用字符串格式函数替换占位符方式。

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

scrapy 得到错误信息

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

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

scrapy 文档中的项目。
item meaning in scrapy

【问题讨论】:

  • tag 和 cont 的列类型是什么?在 SQL 查询中它们的值应该用单引号括起来吗?

标签: python-3.x scrapy format placeholder pymysql


【解决方案1】:

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

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

实现 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'))

注意格式占位符周围的引号。

question 的回答中详细讨论了 MySQL 的引用规则。

【讨论】:

    【解决方案2】:

    我总是这样做

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2017-09-11
      • 2013-01-24
      • 1970-01-01
      • 2013-12-20
      • 2013-08-28
      相关资源
      最近更新 更多