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

jutyujz0  于 2022-11-09  发布在  Mysql
关注(0)|答案(3)|浏览(167)

我如何创建表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']))

它在我的scrappy中工作得很好,现在我用字符串格式函数替换占位符的方式。

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中用格式函数替换占位符?
文件中的项目。
项目含义

kcwpcxri

kcwpcxri1#

简而言之: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'))

请注意格式占位符周围的引号。
MySQL的报价规则将在此question的答案中详细讨论。

mwecs4sa

mwecs4sa2#

我总是做以下事情

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

gijlo24d3#

就像在文档中一样:https://pymysql.readthedocs.io/en/latest/modules/cursors.html#pymysql.cursors.Cursor.execute
如果args是列表或元组,则%s可用作查询中的占位符。如果args是字典,则%(name)s可用作查询中的占位符。

相关问题