#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
Для начала, во фразе нет предложения.