Обновление данных в SQLite-таблице
Этот материал посвящен использованию запроса 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 /> 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 закрыто
Проверить результат можно, посмотрев данные из таблицы.
Разбор примера в подробностях
- Эта строка импортирует модуль sqlite3 в программу.
- С помощью классов и методов из модуля можно взаимодействовать с базой данных.
sqlite3.connect() и connection.cursor() :
- С помощью sqlite3.connect() устанавливается соединение с базой данных SQLite из Python.
- Дальше метод connection.cursor() используется для получения объекта сursor из объекта соединения.
После этого создается запрос UPDATE для обновления строки в таблицы. В нем указываются название колонки и новое значение. В таблице пять колонок, но код обновляет только одну из них – ту, что содержит данные о зарплате.
- Операция, сохраненная в запросе 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 /> 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 /> 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 /> 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 закрыто