我创建了一个包含主键和自动增量的表。
with open('RAND.xml', "rb") as f, sqlite3.connect("race.db") as connection:
c = connection.cursor()
c.execute(
"""CREATE TABLE IF NOT EXISTS race(RaceID INTEGER PRIMARY KEY AUTOINCREMENT,R_Number INT, R_KEY INT,\
R_NAME TEXT, R_AGE INT, R_DIST TEXT, R_CLASS, M_ID INT)""")
我想插入一个元组,当然比总列数少1,因为第一个是自动增量。
sql_data = tuple(b)
c.executemany('insert into race values(?,?,?,?,?,?,?)', b)
如何停止此错误。
sqlite3.OperationalError: table race has 8 columns but 7 values were supplied
答案 0 :(得分:3)
假设列上的特定排序是非常糟糕的做法。某些DBA可能会出现并修改表,从而破坏了SQL语句。其次,只有在INSERT
语句中没有为字段指定值时才会使用自动增量值 - 如果您给出一个值,该值将存储在新行中。
如果您修改代码以阅读
c.executemany('''insert into
race(R_number, R_KEY, R_NAME, R_AGE, R_DIST, R_CLASS, M_ID)
values(?,?,?,?,?,?,?)''',
sql_data)
你应该发现一切都按预期工作。
答案 1 :(得分:1)
如果省略
column-name
之后的table-name
列表,则插入每行的值的数量必须与表格中的列数相同。
RaceID
是表格中的一列,因此当您在没有明确命名列的情况下执行INSERT
时,它会出现。您可以通过在该列中传递SQLite RaceID
值来获得所需的行为(为NULL
指定下一个自动增量值),在Python中None
:
sql_data = tuple((None,) + a for a in b)
c.executemany('insert into race values(?,?,?,?,?,?,?,?)', sql_data)
以上假设b
是executemany
语句的一系列参数序列,并尝试在每个子序列前加None
。根据需要修改代码。