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
操作时,如果不显式命名列,则该列将出现。通过在该列中传递SQLiteNULL
值,可以获得所需的行为(分配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
操作时,如果不显式命名列,则该列将出现。通过在该列中传递SQLiteNULL
值,可以获得所需的行为(分配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个。将尝试添加一个空值,该错误消息的明确含义是thanlen(sql_数据)!=7
-您能用打印的检查一下吗?