Вопрос или проблема
ПРИМЕЧАНИЕ: Я нов в этом сообществе, поэтому дайте знать, если я могу помочь вам помочь мне!
Я создал скрипт на Python, который создает кортеж из (ключ, значение).
Я хотел бы передать как ключ, так и значение в качестве параметризованных переменных в SQL-запросе, который обновляет таблицу в моей базе данных SQLite.
Я exhausted исследование онлайн и методом проб и ошибок и надеюсь, что вы можете помочь. Это вообще возможно?
Пример того, что я хочу достичь:
cur.execute(''' UPDATE Ads SET ?=?''', (tup.keys(),tup.values()))
Столбцы в моей базе данных SQLite3 (идентичны tuple.keys() ):
Marke, Kilometerstand, Erstzulassung, Kraftstoffart, Leistung (PS), Getriebe
Пример моего кортежа:
{‘Marke’: ‘Weitere Automarken’, ‘Kilometerstand’: ‘88.888 km’, ‘Erstzulassung’: ‘Juli 1963’, ‘Kraftstoffart’: ‘Diesel’, ‘Leistung (PS)’: ’69 PS’, ‘Getriebe’: ‘Manuell’}
Говоря в общем, вам нужна строка для выполнения, которая содержит заполнители для значений, содержащихся в кортеже. Кроме того, то, что вы называете своим “кортежем”, на самом деле является словарем Python, но это не проблема.
Из документации sqlite3 мы можем увидеть, что есть два способа корректного использования execute()
:
пример команды дается как:
# Это стиль qmark: cur.execute("insert into people values (?, ?)", (who, age)) # А это именованный стиль: cur.execute("select * from people where name_last=:who and age=:age", {"who": who, "age": age})
И второй пример, именованный стиль, именно то, что будет работать в вашей ситуации. Вы можете попробовать следующее, используя ключи словаря в качестве именованных заполнителей:
cmd = """insert into YOUR_TABLE values Marke=:Marke, Kilometerstand=:Kilometerstand, Erstzulassung=:Erstzulassung, Kraftstoffart=:Kraftstoffart, "Leistung (PS)"=:"Leistung (PS)", Getriebe=:Getriebe"""
cur.execute(cmd, your_dictionary)
Таким образом, каждый из ключей вашего словаря соответствует имени соответствующего столбца в целевой таблице.
Обратите внимание, что я поместил всю cmd
в тройные "
, чтобы создать строковый литерал, который может содержать символ "
. Я думаю, что это будет необходимо, потому что у вас есть имя столбца в таблице, которое содержит пробел: Leistung (PS)
.
Ответ или решение
Для выполнения обновления записи в базе данных SQLite с использованием Python и параметризованного SQL-запроса, вы можете воспользоваться подходом, основанным на использовании "именованных" параметров. В вашем случае, так как вы упомянули, что у вас есть кортеж (на самом деле это словарь) с парами ключ-значение, мы можем легко сопоставить ключи словаря с именами столбцов в таблице базы данных.
Шаги для реализации
- Создайте соединение с базой данных: Используйте библиотеку
sqlite3
для взаимодействия с базой данных SQLite. - Подготовьте параметры для запроса: Используйте ключи вашего словаря как именованные параметры в SQL-запросе, чтобы обновить соответствующие строки таблицы.
- Используйте параметризованные запросы: Это сделает ваш код безопаснее и предотвратит SQL-инъекционные атаки.
Пример кода
Допустим, у вас есть словарь с данными:
data_dict = {
'Marke': 'Weitere Automarken',
'Kilometerstand': '88.888 km',
'Erstzulassung': 'Juli 1963',
'Kraftstoffart': 'Diesel',
'Leistung (PS)': '69 PS',
'Getriebe': 'Manuell'
}
Предположим, у вас есть таблица Ads
, и вы хотите обновить соответствующие строки. SQL-запрос может выглядеть следующим образом:
import sqlite3
# Установите соединение с базой данных (файл базы данных должен существовать)
conn = sqlite3.connect('your_database.db')
cur = conn.cursor()
# Подготовьте команду SQL для обновления записей
cmd = """
UPDATE Ads
SET Marke=:Marke,
Kilometerstand=:Kilometerstand,
Erstzulassung=:Erstzulassung,
Kraftstoffart=:Kraftstoffart,
"Leistung (PS)"=:Leistung,
Getriebe=:Getriebe
WHERE some_condition; -- Укажите условие, чтобы обновить нужные строки
"""
# Выполните команду с использованием подходящих параметров
cur.execute(cmd, data_dict)
# Не забудьте сохранить изменения и закрыть соединение
conn.commit()
conn.close()
Объяснение кода
-
Подключение к базе данных: Вы устанавливаете соединение с базой данных SQLite с помощью
sqlite3.connect()
. Убедитесь, что указанный файл базы данных существует. -
Создание SQL-запроса: SQL-запрос
UPDATE
обновляет значения для указанных полей. Обратите внимание на то, что если в имени столбца есть пробелы (например,Leistung (PS)
), его необходимо заключить в двойные кавычки. -
Параметризация запроса: Используя
:key
, вы обращаетесь к параметрам, которые будут заменены значениями из словаряdata_dict
. -
Выполнение запроса: Метод
execute()
принимает SQL-запрос и словарь, где ключи словаря соответствуют именам параметров, описанным в запросе. -
Закрытие соединения: Обязательно завершите вашу работу с базой данных, вызвав
commit()
для записи изменений иclose()
для закрытия соединения.
Советы по безопасности
- Используйте параметризованные запросы вместо объединения строк для предотвращения SQL-инъекций.
- Убедитесь, что данные, вводимые в базу данных, валидированы заранее, чтобы избежать ошибок при вставке.
Таким образом, применяя вышеописанные шаги, вы сможете успешно обновить записи в вашей базе данных SQLite с использованием Python и параметризованных SQL-запросов.