问题 如何使用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 自动递增?


4959
2017-10-30 11:59


起源



答案:


在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')

这是代码示例的输出。


16
2017-10-30 12:14



非常感谢@Jan Bodnar - 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')

这是代码示例的输出。


16
2017-10-30 12:14



非常感谢@Jan Bodnar - Avi


试试这样:

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
2017-10-30 12:02





看来你已经做到了。因此,插入时无需引用该字段。

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

0
2017-10-30 12:04



当我这样做时,它会分配 name_id 至 没有 - Avi


替换第一个 ? 在 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
2018-02-16 16:35