Первичный ключ SQLite3 не увеличивается автоматически - PullRequest
0 голосов
/ 16 марта 2019

Я пытался написать этот код, надеясь, что он будет автоматически увеличиваться, но почему-то он не работает, и выходные записи в столбце 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)]

Ответы [ 2 ]

0 голосов
/ 17 марта 2019

Отредактированный ответ : Благодаря комментарию Шона я вернулся, чтобы поиграть с кодом и выследить проблему. Это правда, что AUTOINCREMENT не нужен и как таковой не является проблемой (я узнал кое-что новое о SQLite).

Следующий код работает. Обратите внимание: поскольку вы не предоставляете данные во все столбцы таблицы, вы должны указать, в какие столбцы вы вставляете данные в операторе вставки. Я удалил ненужное AUTOINCREMENT и изменил оператор вставки для правильной работы.

Также обратите внимание: как уже говорили другие, вы не должны использовать * подстановочный знак для выбора всех столбцов в рабочем коде, а вместо этого перечислять все столбцы по отдельности.

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 голосов
/ 16 марта 2019

Во-первых, SQLite рекомендует не использовать автоинкремент в качестве основного, следует выбирать поля, которые будут определять уникальную запись, когда это возможно.

Второй тип данных, который вы передаете, - «int» и требует ключевого слова автоинкремента после первичного ключа.

В-третьих, вы должны избегать использования * в вашем предложении выбора. Если вам просто нужен номер строки назад, вы можете запросить нужные поля и добавить их в стандартное поле «rowid».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...