2017-04-10 125 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添加到每個子序列。根據需要修改您的代碼。