Python - 没有自动增量主键值的Sqlite插入元组

时间:2017-04-10 13:32:20

标签: python sqlite

我创建了一个包含主键和自动增量的表。

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

2 个答案:

答案 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)

来自SQLite documentation

  

如果省略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)

以上假设bexecutemany语句的一系列参数序列,并尝试在每个子序列前加None。根据需要修改代码。