我正在尝试使用.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。
这到底发生了什么?
答案 0 :(得分:1)
可以用两种方式构造Sql语句。
通过连接字符串(不安全,易于sql注入攻击)
例如:sql_string = 'INSERT INTO TABLE_1 (COL1, COL2) VALUES(\'' + value1 + '\',\'' + value2 + '\')'
使用占位符和绑定变量(推荐)
例如:sql_string = 'INSERT INTO TABLE_1(COL1,COL2) VALUES (?,?)'
并将绑定变量提供为(value1,value2)
使用绑定变量时,无需引用它们(将它们标识为字符串/文本数据)。在执行语句期间,绑定变量将在数据库中替换。
要准确回答,当您在占位符'?'
周围使用单引号时,它将被视为文本,程序不知道在执行查询时绑定您提供的数据的位置。只需使用不带引号的?
,以便解析器找到占位符以替换数据并执行代码。
cur.execute('''INSERT INTO InventoryData (Inventory_Name)
VALUES ( ? )''', (name,))
答案 1 :(得分:0)
不要引用占位符;使用值
替换占位符时,数据库驱动程序会引用引号cur.execute('''INSERT INTO InventoryData (Inventory_Name)
VALUES ( ? )''', (name,))