web-dev-qa-db-ja.com

Pythonを使用して、SQLiteの列にAUTO INCREMENTを正しく設定する方法は?

私は以下のコードで試しています:

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

誰かが私を助けることができますかname_id自動的に増加しますか?

14
Avi

SQLiteでは、INTEGER PRIMARY KEY列は自動インクリメントされます。 AUTOINCREMENTキーワードもあります。 INTEGER PRIMARY KEY AUTOINCREMENTで使用される場合、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

このコードは正常に動作します。

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

自動インクリメントを使用する場合、列名を明示的に指定する必要があり、自動インクリメントされる列名は省略します。

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

これはコード例の出力です。

23
Jan Bodnar

このようにしてみてください:

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

すでにやったようです。そのため、挿入時にそのフィールドを参照する必要はありません。

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

executemanyステートメントの最初の?nullに置き換えます。

したがって、次の行を書き換えることができます。

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

なので

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