ГДЕ НЕ СУЩЕСТВУЕТ оператор SQL в sqlite3

Мой код таков:

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 integer)")
    conn.commit()
    conn.close()
def insert(title, author, year):
    conn = sqlite3.connect("books.db")
    cur = conn.cursor()
    cur.execute("INSERT INTO book VALUES (NULL, ?, ?, ?)", (title, author, year))
    conn.commit()
    conn.close()
connect()
insert("Title", "Author", 1950)

Я хотел бы использовать инструкцию WHERE NOT EXISTS SQL, чтобы избежать дублирования входных данных. Я пробовал разные способы записи в WHERE NOT EXISTS вдоль cur.execute(), но продолжаю получать:

sqlite3.OperationalError: рядом с "ГДЕ": синтаксическая ошибка


person cidetto    schedule 20.08.2017    source источник


Ответы (1)


Чтобы избежать повторяющихся вставок, используйте уникальный индекс или ограничение:

create unique index unq_book_title_author_year on book(title, author, year);

Это лучше, чем not exists, потому что база данных обеспечивает уникальность. Обратите внимание, что insert будет предпринята попытка, а затем произойдет сбой, если будут предприняты попытки вставки дубликатов.

person Gordon Linoff    schedule 20.08.2017
comment
Как предполагает @GordonLinoff, уникальный индекс вызовет попытки дублировать записи индекса, чтобы вызвать исключение. Ключевым моментом здесь является вопрос о том, что нужно сделать в ситуации, которую вы хотите обнаружить. Предположительно, пользователь должен быть осведомлен о том, что попытка входа уже существует. - person holdenweb; 20.08.2017
comment
Понятно, к сожалению, я, кажется, не знаю, как реализовать уникальный индекс для моего кода (постоянно получаю синтаксическую ошибку). Просто из любопытства я хотел бы также увидеть, как SQL-оператор WHERE NOT EXISTS работает в моем коде. - person cidetto; 20.08.2017
comment
@DanielC.Tremură . . . sqlite.org/lang_createindex.html - person Gordon Linoff; 20.08.2017
comment
К сожалению, оператор SQL INSERT — это просто вставка строки в таблицу без допустимых условий. Синтаксис описан здесь. Возможно, вы захотите рассмотреть INSERT OR REPLACE, но это все равно не будет подбирать дубликаты без индекса. - person holdenweb; 21.08.2017