Этот материал посвящен использованию запроса UPDATE для обновления SQLite-таблицы из приложения, написанного на Python. Вы узнаете, как использовать встроенный модуль sqlite3 для обновления SQLite-таблицы.
В этой статье мы рассмотрим:
- Обновление одной или нескольких колонок.
- Использование запроса с параметрами для передачи значения во время работы программы при запросе Update.
- Коммит и откат операции обновления.
- Обновление колонки с помощью значений date-time и timestamp.
- Выполнение массового обновления в одном запросе.
Подготовка
Перед выполнением следующих операций обновления таблицы SQLite нужно убедиться, что вам известно ее название, а также названия колонок.
В этом примере будет использоваться таблица sqlitedb_developers
. Она была создана в первой части руководства по sqlite3 и заполнена во второй.
Обновления одной записи в таблице SQLite
Сейчас таблица sqlitedb_developers
содержит шесть строк, поэтому обновим зарплату разработчика с id 4. Для выполнения запроса UPDATE из Python нужно выполнить следующие шаги:
- Сперва нужно установить SQLite-соединение из Python.
- Дальше необходимо создать объект
cursor
с помощью объекта соединения. - После этого – создать запрос UPDATE. Для этого нужно знать названия таблицы и колонки, которую потребуется обновить.
- Дальше запрос выполняется с помощью
cursor.execute()
. - После успешного завершения запроса нужно не забыть закоммитить изменения в базу данных.
- Соединение с базой данных закрывается.
- Также важно не забыть перехватывать все исключения SQLite.
- Наконец, нужно убедиться, что операция прошло успешно, получив данные из таблицы.
Посмотрим на программу.
import sqlite3
def update_sqlite_table():
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sql_update_query = """Update sqlitedb_developers set salary = 10000 where id = 4"""
cursor.execute(sql_update_query)
sqlite_connection.commit()
print("Запись успешно обновлена")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
update_sqlite_table()
Вывод: таблица sqlitedb_developers
после обновления строки из Python.
Подключен к SQLite
Запись успешно обновлена
Соединение с SQLite закрыто
Проверить результат можно, посмотрев данные из таблицы.
Разбор примера в подробностях
import sqlite3
:
- Эта строка импортирует модуль sqlite3 в программу.
- С помощью классов и методов из модуля можно взаимодействовать с базой данных.
sqlite3.connect()
и connection.cursor()
:
- С помощью
sqlite3.connect()
устанавливается соединение с базой данных SQLite из Python. - Дальше метод
connection.cursor()
используется для получения объектасursor
из объекта соединения.
После этого создается запрос UPDATE для обновления строки в таблицы. В нем указываются название колонки и новое значение. В таблице пять колонок, но код обновляет только одну из них – ту, что содержит данные о зарплате.
cursor.execute()
:
- Операция, сохраненная в запросе UPDATE, выполняется с помощью метода
execute()
объектасursor
. connection.commit()
применяется для сохранения в базе данных.
Наконец, закрываются объекты сursor
и соединение в блоке finally
после завершения операции обновления.
Примечание: если выполняется операция массового обновления и есть необходимость откатить изменения в случае ошибки хотя бы при одном, нужно использовать функцию
rollback()
классаconnection
. Ее необходимо применить в блокеexcept
.
Использование переменных Python в запросе UPDATE
Большую часть времени обновление таблицы нужно выполнять с помощью значений, получаемых при работе программы. Например, когда пользователи обновляют свой профиль через графический интерфейс, нужно обновить заданные ими значения в соответствующей таблице.
В таком случае рекомендуется использовать запрос с параметрами. Такие запросы используют заполнители (?
) прямо внутри инструкций SQL. Это помогает обновлять значения с помощью переменных, а также предотвращать SQL-инъекции.
import sqlite3
def update_sqlite_table(dev_id, salary):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sql_update_query = """Update sqlitedb_developers set salary = ? where id = ?"""
data = (salary, dev_id)
cursor.execute(sql_update_query, data)
sqlite_connection.commit()
print("Запись успешно обновлена")
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
update_sqlite_table(3, 7500)
Вывод: таблица sqlitedb_deveopers
после обновления с помощью переменной Python и запроса с параметрами.
Подключен к SQLite
Запись успешно обновлена
Соединение с SQLite закрыто
Подтвердить операцию можно, получив данные из SQLite-таблицы из Python.
Разберем код:
- Запрос с параметрами был использован для того, чтобы получить значения при работе программы и установить их на места заполнителей. В этом случае один из них отвечает за колонку «salary», а второй – колонку
id
. - После этого готовится кортеж с данными из двух переменных Python в определенном порядке. Этот кортеж вместе с запросом передается в метод
cursor.execute()
. Важно помнить, что в данном случае порядок переменных в кортеже играет значение. - В конце изменения закрепляются с помощью метода
commit
классаconnection
.
Обновление нескольких строк SQLite-таблицы
В последнем примере использовался метод execute()
объекта cursor
для обновления одного значения, но иногда в приложениях Python нужно обновить несколько строк. Например, нужно увеличить зарплату большинства разработчиков на 20%.
Вместе выполнения операции UPDATE каждый раз для каждой записи можно выполнить массовое обновление в один запрос. Изменить несколько записей в таблице SQLite в один запрос можно с помощью метода cursor.executemany()
.
Метод cursor.executemany(query, seq_param)
принимает два аргумента: SQL-запрос и список записей для обновления.
Посмотрим на примере. Здесь обновляется зарплата 3 разработчиков.
import sqlite3
def update_multiple_records(record_list):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_update_query = """Update sqlitedb_developers set salary = ? where id = ?"""
cursor.executemany(sqlite_update_query, record_list)
sqlite_connection.commit()
print("Записей", cursor.rowcount, ". Успешно обновлены")
sqlite_connection.commit()
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
records_to_update = [(9700, 4), (7800, 5), (8400, 6)]
update_multiple_records(records_to_update)
Вывод: таблица sqlitedb_developers
после обновления нескольких строк из Python.
Подключен к SQLite
Записей 3 . Успешно обновлены
Соединение с SQLite закрыто
Проверить результат можно, получив данные из таблицы из Python.
Разберем код:
- После подключения к таблице SQLite готовится SQLite-запрос с двумя заполнителями (колонки salary и id), а также список записей для обновления в формате кортежа.
- Каждый элемент – это кортеж для каждой записи. Каждый кортеж содержит два значения: зарплату и id разработчика.
- Функция
cursor.executemany(sqlite_update_query, record_list)
вызывается для обновления нескольких строк таблицы SQLite. - Чтобы узнать, какое количество записей было изменено, используется функция
cursor.rowcount
. Наконец, данные сохраняются в базу данных с помощью методаcommit
классаconnection
.
Обновление нескольких колонок таблицы SQLite
Можно обновить несколько колонок таблицы SQLite в один запрос. Для этого нужно лишь подготовить запрос с параметрами и заполнителями. Посмотрим на примере.
Вывод: таблица sqlitedb_developers
после обновления нескольких колонок.
import sqlite3
def update_multiple_columns(dev_id, salary, email):
try:
sqlite_connection = sqlite3.connect('sqlite_python.db')
cursor = sqlite_connection.cursor()
print("Подключен к SQLite")
sqlite_update_query = """Update sqlitedb_developers set salary = ?, email = ? where id = ?"""
column_values = (salary, email, dev_id)
cursor.execute(sqlite_update_query, column_values)
sqlite_connection.commit()
print("Несколько столбцов успешно обновлены")
sqlite_connection.commit()
cursor.close()
except sqlite3.Error as error:
print("Ошибка при работе с SQLite", error)
finally:
if sqlite_connection:
sqlite_connection.close()
print("Соединение с SQLite закрыто")
update_multiple_columns(3, 2500, 'bec9988@gmail.com')
Подключен к SQLite
Несколько столбцов успешно обновлены
Соединение с SQLite закрыто