【问题标题】:python sqlite named parameter containing dashpython sqlite命名参数包含破折号
【发布时间】:2015-03-27 10:57:13
【问题描述】:

我正在尝试使用 python 中的命名参数(使用 sqlite3 模块)将记录插入到 sqlite 数据库中。 我要插入的值在字典中,但字典键可能包含破折号,例如{'request-id': 100, 'year': '2015'}。 我正在尝试执行以下操作:

import sqlite3
conn = sqlite3.connect('database.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS requests (request_id text, year text)''')
query = '''INSERT INTO requests (request_id, year) VALUES (:request-id, :year)'''
cursor.execute(query, {'request-id': 100, 'year': '2015'})
conn.commit()
conn.close()

我在插入语句期间收到此错误:

sqlite3.OperationalError: no such column: id

似乎破折号不能作为命名参数被很好地接受。

有很多解决方法,比如创建一个新字典,其中键中的破折号被下划线替换,但我想知道是否可以使用一些转义技术或其他方法来避免这种情况。

感谢您的帮助

【问题讨论】:

  • 您的 column names 也不匹配。在create 中是date,在insert 中是year
  • 不,我猜,这里的id 是指创建表时date 的使用不一致,之后使用year
  • 对不起,这是一个剪切和粘贴错误,实际表格包含“年份”列。我已经相应地编辑了这个问题。谢谢

标签: python sqlite named-parameters


【解决方案1】:

documentation for sqlite3_bind_* 声明参数名称必须由字母数字字符组成,并且没有提及转义它们的方法。

您的查询可能被解析为:request - id,即:request 减去id,并且由于没有id 这样的列,SQLite 会抛出错误。

(另外,正如 Prera​​k Sola 指出的那样,您使用 date 列创建表,但尝试插入不存在的 year 列。)

【讨论】:

    【解决方案2】:

    SQL 参数名称没有引用或转义机制;您必须使用与未加引号的标识符相同的规则。

    【讨论】:

      猜你喜欢
      • 2015-05-28
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2021-05-06
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多