Python-Sqlite插入不带自动递增主键值的元组

Python-Sqlite插入不带自动递增主键值的元组,python,sqlite,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,\

我使用主键和自动增量创建了一个表

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)""")
 sql_data = tuple(b)
    c.executemany('insert into race values(?,?,?,?,?,?,?)', b)
然后我想插入一个元组,它的数量当然比总列少1个,因为第一个是自动增量

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)""")
 sql_data = tuple(b)
    c.executemany('insert into race values(?,?,?,?,?,?,?)', b)
如何停止此错误

sqlite3.OperationalError: table race has 8 columns but 7 values were supplied
从:

如果省略
表名
之后的
列名
列表,则插入到每行的值数必须与表中的列数相同

RaceID
是表中的一列,因此在执行
INSERT
操作时,如果不显式命名列,则该列将出现。通过在该列中传递SQLite
NULL
值,可以获得所需的行为(分配
RaceID
下一个自动增量值),在Python中,该值是
None

sql_data = tuple((None,) + a for a in b)
c.executemany('insert into race values(?,?,?,?,?,?,?,?)', sql_data)
以上假设
b
executemany
语句的一系列参数序列,并尝试将
None
前置到每个子序列。根据需要修改代码。

来自:

如果省略
表名
之后的
列名
列表,则插入到每行的值数必须与表中的列数相同

RaceID
是表中的一列,因此在执行
INSERT
操作时,如果不显式命名列,则该列将出现。通过在该列中传递SQLite
NULL
值,可以获得所需的行为(分配
RaceID
下一个自动增量值),在Python中,该值是
None

sql_data = tuple((None,) + a for a in b)
c.executemany('insert into race values(?,?,?,?,?,?,?,?)', sql_data)

以上假设
b
executemany
语句的一系列参数序列,并尝试将
None
前置到每个子序列。根据需要对代码进行修改。

在列上假定特定的顺序是非常糟糕的做法。一些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)

你会发现一切都按预期进行。

假设列上有特定的顺序是非常糟糕的做法。一些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)

您应该会发现一切都按预期进行。

我可能稍微误导了您,因为我相信如果您尝试在主键字段中存储NULL(因为NULL永远不是有效的主键),某些数据库将生成自动增量值。是的,它仍然会出错。λpython xml_race.py回溯(最后一次调用):文件“xml_race.py”,第78行,在值(?,,,,,,,,,,,,?)'',sql_数据)sqlite3中。编程错误:提供的绑定数量不正确。当前语句使用7,提供了6个。将尝试添加一个空值,该错误消息的明确含义是than
len(sql_数据)!=7
-您能用打印的
检查一下吗?我可能有点误导了您,因为我相信如果您试图在主键字段中存储空值(因为空值从来都不是有效的主键),某些数据库会生成自动递增值。是的,它仍然会出错。λpython xml_race.py回溯(最后一次调用):文件“xml_race.py”,第78行,在值(?,,,,,,,,,,,,?)'',sql_数据)sqlite3中。编程错误:提供的绑定数量不正确。当前语句使用7,提供了6个。将尝试添加一个空值,该错误消息的明确含义是than
len(sql_数据)!=7
-您能用打印的
检查一下吗?