2017-04-10 2 views
0

Ich erstelle eine Tabelle mit Primärschlüssel und Autoinkrement.Python - Sqlite Tuple einfügen ohne den Autoinkrement Primärschlüssel Wert

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)""") 

Ich möchte ein Tupel dann einzufügen, die natürlich 1 eine geringere Anzahl als die Summe der Spalten hat, weil die erste autoincrement ist.

sql_data = tuple(b) 
    c.executemany('insert into race values(?,?,?,?,?,?,?)', b) 

Wie kann ich diesen Fehler stoppen?

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

Antwort

3

Es ist extrem schlechte Praxis, eine bestimmte Reihenfolge auf den Spalten anzunehmen. Einige DBA könnten die Tabelle ändern und Ihre SQL-Anweisungen brechen. Zweitens wird ein Autoinkrement-Wert nur verwendet, wenn Sie in Ihrer INSERT-Anweisung keinen Wert für das Feld angeben. Wenn Sie einen Wert angeben, wird dieser Wert in der neuen Zeile gespeichert.

Wenn Sie den Code ändern

c.executemany('''insert into 
      race(R_number, R_KEY, R_NAME, R_AGE, R_DIST, R_CLASS, M_ID) 
      values(?,?,?,?,?,?,?)''', 
      sql_data) 

Sie finden sollte zu lesen, dass alles wie erwartet funktioniert.

+0

Ich habe Sie möglicherweise leicht irregeführt, da ich glaube, dass einige Datenbanken einen Autoinkrementwert generieren, wenn Sie versuchen, eine NULL im Primärschlüsselfeld zu speichern (da NULL niemals ein gültiger Primärschlüssel ist). – holdenweb

+0

Ja es noch Fehler. λ python xml_race.py Traceback (letzter Aufruf zuletzt): Datei "xml_race.py", Zeile 78, in Werte (?,?,?,?,?,?,?) '' ', sql_data) sqlite3.ProgrammingError: Falsche Anzahl der gelieferten Bindungen. Die aktuelle Anweisung verwendet 7, und es werden 6 bereitgestellt. Will versuchen, fügen Sie eine Null in – sayth

+0

Die klare Implikation dieser Fehlermeldung ist als 'len (sql_data)! = 7 '- können Sie das mit einem' print' überprüfen? – holdenweb

1

Vom 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 ist eine Spalte in der Tabelle, so wird erwartet, anwesend zu sein, wenn Sie ein INSERT tun, ohne die Spalten explizit zu benennen. Sie können das gewünschte Verhalten bekommen (zuweisen RaceID der nächste Autoinkrement-Wert) durch einen SQLite NULL Wert in dieser Spalte verläuft, die in Python None ist:

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

Die obige b annimmt ist eine Folge von Sequenzen von Parametern für Ihre executemany Anweisung und versucht, None zu jeder Untersequenz voranzustellen. Ändern Sie, wie für Ihren Code erforderlich.

Verwandte Themen