【问题标题】:SQLite3 primary key not auto incrementingSQLite3 主键不自动递增
【发布时间】:2019-08-07 15:18:29
【问题描述】:

我尝试编写此代码,希望它会自动递增,但不知何故它不起作用,并且 id 列中的输出条目设置为“无”。我也尝试了其他答案,但它们都不起作用。请帮忙如果可能的话。

代码如下:

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)]

【问题讨论】:

  • cur.execute("CREATE TABLE IF NOT EXISTS book (id INTEGER PRIMARY KEY AUTOINCREMENT,title text,author text,year int,isbn int)")。此外,说明您要插入的值也是一个好习惯,所以cur.execute("INSERT INTO book (title, author, year, isbn) VALUES (?,?,?, ?)",(title,author,year,isbn))
  • 您发布的表定义和插入语句应该会导致 sqlite 自动将值分配给 id 列。您是否预先使用具有不同表定义的数据库? IF NOT EXISTS 隐藏它很容易做到。也许INT PRIMARY KEY 代替?
  • 问题已解决。我没有使用 IF NOT EXISTS ,而是先使用 DROP TABLE ,然后使用 CREATE TABLE 再次创建表。感谢您的建议。

标签: python python-3.x sqlite auto-increment


【解决方案1】:

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

您要传入的第二种数据类型是“int”,并且需要在主键后面加上 autoincrement 关键字。

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

【讨论】:

  • 您需要AUTOINCREMENTINTEGER PRIMARY KEY 列来自动分配rowid 编号,这是一个不幸的、非常常见的误解。关键字实际上只是改变了这些数字的计算方式,没有它,表格也能正常工作(通常不应该有它以获得更好的性能):sqlite.org/autoinc.html
【解决方案2】:

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

以下代码确实有效。请注意,由于您没有向表中的所有列提供数据,因此您必须在插入语句中指定要将数据插入哪些列。我已经删除了不必要的 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)]

【讨论】:

  • sqlite 不需要AUTOINCREMENT,顺便说一句:sqlite.org/autoinc.html 有详细信息。
  • 我不知道为什么,但这对我不起作用。我使用 schema 文件中的 cursor.executescript(fp.read()) 从 sql 文件创建,并且在该文件中我有 id int, primary key(id),但是在没有 id 字段的值中插入提供命名参数的语句最终只是制作了 id对于每个条目None
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-13
  • 2013-09-28
  • 2017-02-10
  • 2016-11-11
  • 1970-01-01
  • 2012-07-14
相关资源
最近更新 更多