it-swarm.com.de

Wie kann man AUTO INCREMENT in SQLite mit Python richtig auf eine Spalte setzen?

Ich habe mit dem folgenden Code versucht:

import sqlite3
data_person_name = [('Michael', 'Fox'),
                    ('Adam', 'Miller'),
                    ('Andrew', 'Peck'),
                    ('James', 'Shroyer'),
                    ('Eric', 'Burger')]
con = sqlite3.connect(":memory:")
c = con.cursor()
c.execute('''CREATE TABLE q1_person_name
             (name_id integer auto_increment primary key,
              first_name varchar(20) NOT NULL,
              last_name varchar(20) NOT NULL)''')
c.executemany('INSERT INTO q1_person_name VALUES (?,?,?)', data_person_name)
for row in c.execute('SELECT * FROM q1_person_name'):
    print row

Kann mir jemand helfen, den name_id automatisch inkrementieren zu lassen? 

13
Avi

In SQLite wird die Spalte INTEGER PRIMARY KEY automatisch inkrementiert. Es gibt auch ein AUTOINCREMENT-Schlüsselwort. Bei Verwendung in INTEGER PRIMARY KEY AUTOINCREMENT wird ein etwas anderer Algorithmus für die ID-Erstellung verwendet.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sqlite3
data_person_name = [('Michael', 'Fox'),
                    ('Adam', 'Miller'),
                    ('Andrew', 'Peck'),
                    ('James', 'Shroyer'),
                    ('Eric', 'Burger')]

con = sqlite3.connect(":memory:")
c = con.cursor()

c.execute('''CREATE TABLE q1_person_name
             (name_id INTEGER PRIMARY KEY,
              first_name varchar(20) NOT NULL,
              last_name varchar(20) NOT NULL)''')
c.executemany('INSERT INTO q1_person_name(first_name, last_name) VALUES (?,?)', data_person_name)

for row in c.execute('SELECT * FROM q1_person_name'):
    print row

Dieser Code funktioniert jetzt OK.

c.executemany('INSERT INTO q1_person_name(first_name, last_name) VALUES (?,?)', data_person_name)

Bei der Verwendung des automatischen Inkrementierens müssen wir die Spaltennamen explizit angeben, wobei die _ _.

$ ./test.py 
(1, u'Michael', u'Fox')
(2, u'Adam', u'Miller')
(3, u'Andrew', u'Peck')
(4, u'James', u'Shroyer')
(5, u'Eric', u'Burger')

Dies ist die Ausgabe des Codebeispiels.

20
Jan Bodnar

Versuchen Sie es so:

c.execute('''CREATE TABLE q1_person_name
         (name_id integer primary key AUTOINCREMENT,
          first_name varchar(20) NOT NULL,
          last_name varchar(20) NOT NULL)''')
0
Naveed

Es scheint, dass du es schon getan hast. Daher müssen Sie beim Einfügen nicht auf dieses Feld verweisen.

INSERT INTO q1_person_name (first_name, last_name) VALUES (?,?)
0
Daniel Roseman

Ersetzen Sie den ersten ? in executemany-Anweisung durch null

So kann die folgende Zeile umgeschrieben werden: 

c.executemany('INSERT INTO q1_person_name VALUES (?,?,?)', data_person_name)

wie

c.executemany('INSERT INTO q1_person_name VALUES (null,?,?)', data_person_name)
0