Python 3.x sqlite3-提供的绑定数量不正确

Python 3.x sqlite3-提供的绑定数量不正确,python-3.x,sqlite,sql-insert,Python 3.x,Sqlite,Sql Insert,第一次,所以要温柔。我正在创建一个def,它查看表的列,然后查找该表的列名。然后,它使用这些列名来帮助构造INSERT语句,以便将数据放入该表中 我已经在这个网站上检查了一些其他的查询,因为这似乎是一个泛型问题,但是找不到任何与此相关的内容 代码如下: sqlite_file = 'pmi.db' db = sqlite3.connect(sqlite_file) cur = db.cursor() cur.execute('PRAGMA TABLE_INFO(

第一次,所以要温柔。我正在创建一个def,它查看表的列,然后查找该表的列名。然后,它使用这些列名来帮助构造INSERT语句,以便将数据放入该表中

我已经在这个网站上检查了一些其他的查询,因为这似乎是一个泛型问题,但是找不到任何与此相关的内容

代码如下:

    sqlite_file = 'pmi.db'
    db = sqlite3.connect(sqlite_file)
    cur = db.cursor()

    cur.execute('PRAGMA TABLE_INFO({})'.format(table_name))
    columns = [tblcols[1] for tblcols in cur.fetchall()]
    print(columns) # for testing
    print(len(columns)) # for testing

    lpmid_id = 2
    pmname = "Test"
    pmpertbl = "An"

    cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', [columns])

    db.commit()
“table_name”在运行def时作为参数传递

我知道:

columns = [1, 2.3, 'xxx']
cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', [columns])
如果我不尝试传递columns变量,而是在其位置传递每个变量lpmid_id、pmname、pmpertbl,那么查询将无误地发布

在使用变量“columns”时,会出现以下错误

>>> sqlts("lpmid")
['id', 'pmname', 'pmpertbl']
3
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    sqlts("lpmid")
  File "C:/Python35/Programs/SQLTest.py", line 27, in sqlts
    raise e
  File "C:/Python35/Programs/SQLTest.py", line 21, in sqlts
    cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', [columns])
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 3, and there are 1 supplied.
sqlts(“lpmid”) ['id','pmname','pmpertbl'] 3. 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 sqlts(“lpmid”) 文件“C:/Python35/Programs/SQLTest.py”,第27行,在sqlts中 提高e 文件“C:/Python35/Programs/SQLTest.py”,第21行,在sqlts中 当前执行('INSERT INTO'+表名+'值(?,?),[列]) sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用3,提供了1个。 前两行是我检查的事实,即我有正确的列数和这些列的名称

你知道这是怎么回事吗。我有一种感觉,这可能与提取列的格式有关,但我看不出我需要做些什么才能让它正常运行

如果您还想提及任何其他特定于代码的问题,请随时联系

谢谢


Phil

您的代码相当于以下代码:

columns = [1, 2.3, 'xxx']
cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', [columns])
与此相同:

cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', [[1, 2.3, 'xxx']])
这是一个列表,其第一个(也是唯一一个)元素是列表

execute()
需要一个简单的列表:

columns = [...]
cur.execute('INSERT INTO ' + table_name + ' VALUES(?,?,?)', columns)

您正在传递要执行的列表列表,而它需要一个元组。删除调用execute中的方括号就足够了。谢谢。我尝试了此操作,但出现以下错误('INSERT INTO'+table_name+'VALUES(?,?)',columns)sqlite3.IntegrityError:数据类型不匹配