sqlite python executemany ЗАМЕНИТЬ, ЕСЛИ столбец соответствует условию ELSE ИГНОРИРОВАТЬ

#python #sqlite #replace

#python #sqlite #заменить

Вопрос:

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

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

Пользователь 2 отправляет queryList2, где малина была вычеркнута, а шпинат был добавлен в список.

 import sqlite3 as lite

queryList1 = [("Raspberries",0),("Water",0),("Lemon",1)]
queryList2 = [("Raspberries",1),("Water",0),("Spinach",0)]


# -- open the connection and create a cursor
conn  = lite.connect(':memory:')
cursor = conn.cursor()

conn.execute("""CREATE TABLE shoppingList (
        item STRING UNIQUE,
        checked INTEGER
        );""")

# ----------- First Query -----------------
insertQuery1 = """INSERT INTO shoppingList
            VALUES (:item, :checked);"""
with conn:
    cursor.executemany(insertQuery1, queryList1)


# ----------- Second Query -----------------
insertQuery2 = """INSERT OR IGNORE INTO shoppingList
                 VALUES (:item, :checked);
            """ 
with conn:
    cursor.executemany(insertQuery2, queryList2)

# ----------- Display Result Query -----------------
with conn:
    cursor.execute("SELECT * FROM shoppingLIST")
print(cursor.fetchall())


# ------------------- close the curser and the database ----------------------
cursor.close()
conn.close()
 

Этот код дает мне результат:

 [("Raspberries",0),("Water",0), ("Lemon",1),("Spinach",1)]
 

И это должно дать мне следующий результат:

 [("Raspberries",1),("Water",0), ("Lemon",1),("Spinach",1)]
 

Я попытался обновить базу данных, используя следующую вторую команду запроса:

 with conn:
     cursor.executemany("""INSERT OR REPLACE INTO shoppingList VALUES(?,?)
                SELECT item,checked WHERE NOT EXISTS(SELECT * FROM shoppingList
                WHERE checked = 1);
                """, queryList2)
 

Это приводит к необъясненной синтаксической ошибке, которую я не могу устранить.
Заранее большое спасибо за вашу помощь.

Ответ №1:

(Малина, 0) — ожидаемый результат. Вторая вставка ИГНОРИРУЕТСЯ (уникальное ограничение нарушено), DML не выполняется. Если версия sqlite ( sqlite3.sqlite_version ) не менее 3.24, то, возможно, UPSERT решит проблему. Или это просто опечатка?

Второй запрос не является допустимым синтаксисом sqlite3, полная остановка. SELECT item,checked from Для начала, во фразе нет предложения.