2017-04-10 78 views
0

我使用主键和自动增量创建了一个表。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 

回答

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) 

你会发现,一切正常。

+0

我可能会误导你,因为我相信如果你试图在主键字段中存储NULL(因为NULL永远不是有效的主键),一些数据库会生成自动增量值。 – holdenweb

+0

是的,它仍然是错误。 'python xml_race.py Traceback(最近呼叫的最后一个): 文件“xml_race.py”,第78行,在 值(?,?,?,?,?,?,?)''',sql_data) sqlite3.ProgrammingError:提供的绑定数量不正确。当前的语句使用7,并提供了6。将尝试在 – sayth

+0

中添加一个空值该错误消息的明确含义不是“len(sql_data)!= 7” - 您可以使用“print”来检查它以验证吗? – holdenweb

1

SQLite documentation

If the column-name list after table-name is omitted then the number of values inserted into each row must be the same as the number of columns in the table.

RaceID是在表中的列,因此预期当你做一个INSERT没有明确命名的列存在。可以通过在该列,这在Python是None传递一个SQLite NULL值获得所需的行为(分配RaceID下一自动增量值):

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

上面假定b为的参数的序列的序列您的executemany声明并尝试将None添加到每个子序列。根据需要修改您的代码。