2014-10-30 11 views
9

Ho cercato con il codice qui sotto:Come impostare correttamente AUTO INCREMENT per una colonna in SQLite, usando Python?

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 

Qualcuno può aiutarmi a rendere il name_id incrementato automaticamente?

risposta

11

Nella colonna SQLite, INTEGER PRIMARY KEY viene incrementata automaticamente. C'è anche una parola chiave AUTOINCREMENT. Se utilizzato in INTEGER PRIMARY KEY AUTOINCREMENT, viene utilizzato un algoritmo leggermente diverso per la creazione dell'ID .

#!/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 

Questo codice ora funziona OK.

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

Quando si utilizza auto-incremento, dobbiamo dichiarare esplicitamente i nomi delle colonne, omettendo il quella che è auto-incrementato.

$ ./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') 

Questo è l'output dell'esempio di codice.

+0

Grazie mille @Jan Bodnar – Avi

0

Prova in questo modo:

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

Sembra che hai fatto già. Quindi non è necessario fare riferimento a quel campo quando si inserisce.

INSERT INTO q1_person_name (first_name, last_name) VALUES (?,?) 
+0

Quando faccio questo assegna il 'name_id' a ** None ** – Avi

0

Sostituisci il primo? in executemany istruzione con null.

Così la seguente riga può essere riscritta:

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

come

c.executemany (' INSERISCI IN VALORE q1_person_name VALORI (null,?,?) ', Data_person_name)

Problemi correlati