尝试插入信息时出现sqlite3错误,提供的绑定数量不正确

时间:2016-11-21 09:29:29

标签: python sqlite

我正在尝试使用.txt文件中的一些数据在sqlite中创建一个表。我正在使用python,这是我的代码:

import sqlite3

conn = sqlite3.connect('TEST_Inventory.sqlite')
cur = conn.cursor()

cur.execute('''
DROP TABLE IF EXISTS InventoryData''')

cur.execute('''
CREATE TABLE `InventoryData` (
    `INV_ID`    INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
    `Inventory_Name`    TEXT)''')

fname = ('NameINV.txt')
fh = open(fname)
for line in fh:
    name = line.split()
    print name
    cur.execute('''INSERT INTO InventoryData (Inventory_Name) 
        VALUES ( '?' )''', (name,))
    cur.commit()

但是,每次我尝试运行此代码时都会收到此错误:

sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用0,并且提供了1。

这到底发生了什么?

2 个答案:

答案 0 :(得分:1)

可以用两种方式构造Sql语句。

  1. 通过连接字符串(不安全,易于sql注入攻击) 例如:sql_string = 'INSERT INTO TABLE_1 (COL1, COL2) VALUES(\'' + value1 + '\',\'' + value2 + '\')'

  2. 使用占位符和绑定变量(推荐) 例如:sql_string = 'INSERT INTO TABLE_1(COL1,COL2) VALUES (?,?)'并将绑定变量提供为(value1,value2)

  3. 使用绑定变量时,无需引用它们(将它们标识为字符串/文本数据)。在执行语句期间,绑定变量将在数据库中替换。

    要准确回答,当您在占位符'?'周围使用单引号时,它将被视为文本,程序不知道在执行查询时绑定您提供的数据的位置。只需使用不带引号的?,以便解析器找到占位符以替换数据并执行代码。

    cur.execute('''INSERT INTO InventoryData (Inventory_Name) 
            VALUES ( ? )''', (name,))
    

答案 1 :(得分:0)

不要引用占位符;使用值

替换占位符时,数据库驱动程序会引用引号
cur.execute('''INSERT INTO InventoryData (Inventory_Name) 
    VALUES ( ? )''', (name,))