J'ai essayé avec le code ci-dessous:
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
Quelqu'un peut-il m'aider à rendre le name_id
incrémenté automatiquement?
Dans SQLite, la colonne INTEGER PRIMARY KEY
est auto-incrémentée. Il existe également un mot clé AUTOINCREMENT
. Lorsqu'il est utilisé dans INTEGER PRIMARY KEY AUTOINCREMENT
, un algorithme légèrement différent pour la création d'identifiant est utilisé.
#!/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
Ce code fonctionne maintenant correctement.
c.executemany('INSERT INTO q1_person_name(first_name, last_name) VALUES (?,?)', data_person_name)
Lorsque vous utilisez l'incrémentation automatique, vous devez indiquer explicitement les noms de colonne, en omettant leone incrémenté automatiquement.
$ ./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')
Ceci est la sortie de l'exemple de code.
Essayez comme ça:
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)''')
Il semble que vous l'avez déjà fait. Il n'est donc pas nécessaire de référencer ce champ lorsque vous insérez.
INSERT INTO q1_person_name (first_name, last_name) VALUES (?,?)
Remplacez la première instruction ?
dans executemany
par null
.
Donc, la ligne suivante peut être réécrite:
c.executemany('INSERT INTO q1_person_name VALUES (?,?,?)', data_person_name)
comme
c.executemany('INSERT INTO q1_person_name VALUES (null,?,?)', data_person_name)