SQLite3主键不自动递增

问题描述 投票:0回答:2

我尝试编写这段代码,希望它会自动递增,但不知何故它不起作用,id列中的输出条目设置为'None'。我也尝试了其他答案,但没有一个正在工作。请尽可能帮助。

这是代码:

import sqlite3

def connect():
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY,title text,author text,year int,isbn int)")
    conn.commit()
    conn.close()

def insert(title,author,year,isbn):
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("INSERT INTO book VALUES (?,?,?,?)",(title,author,year,isbn))
    conn.commit()
    conn.close()

def view():
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("SELECT * FROM book ")
    rows=cur.fetchall()
    conn.close()
    return rows

connect()
insert("sample","abc",2003,123456)
insert("sample2","def",2003,123457)
print(view())

这是输出:

[(None, 'sample', 'abc', 2003, 123456), (None, 'sample2', 'def', 2003, 123457)]
python python-3.x sqlite auto-increment
2个回答
0
投票

答案编辑:感谢Shawn的评论我回去玩代码并追捕问题确实不需要AUTOINCREMENT,因此不是问题(我学到了一些关于sqlite的新知识)。

以下代码确实有效。请注意,由于您未向表中的所有列提供数据,因此必须在insert语句中指定要将数据插入的列。我删除了不必要的AUTOINCREMENT,并修改了insert语句以使其正常工作。

另请注意:正如其他人所说,您不应使用*外卡来选择生产代码中的所有列,而是列出所有列。

import sqlite3

def connect():
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY,title text,author text,year int,isbn int)")
    conn.commit()
    conn.close()

def insert(title,author,year,isbn):
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("INSERT INTO book (title, author, year, isbn) VALUES (?,?,?,?)",(title,author,year,isbn))
    conn.commit()
    conn.close()

def view():
    conn=sqlite3.connect("books.db")
    cur=conn.cursor()
    cur.execute("SELECT * FROM book ")
    rows=cur.fetchall()
    conn.close()
    return rows

connect()
insert("sample","abc",2003,123456)
insert("sample2","def",2003,123457)
print(view())

产生的输出是:

[(1, 'sample', 'abc', 2003, 123456), (2, 'sample2', 'def', 2003, 123457)]

0
投票

首先,SQLite建议您不要使用自动增量作为主要增量,应尽可能选择将定义唯一记录的字段。

其次,您传入的数据类型是“int”,并且需要在主键后面使用autoincrement关键字。

第三,你应该避免在你的select语句中使用*。如果您只需要一个行号,您可以查询所需的字段并添加标准字段“rowid”。

© www.soinside.com 2019 - 2024. All rights reserved.