Обновление данных в 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 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 закрыто

Проверить результат можно, посмотрев данные из таблицы.

Обновления одной записи в таблице 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.

Использование переменных Python в запросе UPDATE

Разберем код:

  • Запрос с параметрами был использован для того, чтобы получить значения при работе программы и установить их на места заполнителей. В этом случае один из них отвечает за колонку «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 готовится 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 закрыто

Появились вопросы? Задайте на Яндекс Кью

У блога есть сообщество на Кью >> Python Q <<. Там я и другие участники отвечаем на вопросы по python, программированию и контенту сайта.

Обучение Python и Data Science

Профессия Python-разработчик / Skillbox

Профессия Python-разработчик / Skillbox

7 313 2 925 ₽/мес.
Профессия Python Fullstack / Skillbox

Профессия Python Fullstack / Skillbox

6 569 2 627 ₽/мес.
Профессия Data Scientist / Skillbox

Профессия Data Scientist / Skillbox

9 187 3 675 ₽/мес.
Python-фреймворк на Django / Skillbox

Python-фреймворк на Django / Skillbox

818 ₽/мес.
Профессия DS: машинное обучение / Skillbox

Профессия DS: машинное обучение / Skillbox

6172 2469 ₽/мес.
Профессия DS: анализ данных / Skillbox

Профессия DS: анализ данных / Skillbox

6172 2469 ₽/мес.

Вам помогла эта статья? Поделитесь в соцсетях или блоге. Репосты помогают сайту развиться.

Александр эксперт Яндекс.Кью
Я создал этот блог в 2018 году, чтобы распространять полезные учебные материалы, документации и уроки на русском. На сайте опубликовано множество статей по основам python и библиотекам, уроков для начинающих и примеров написания программ.
Мои контакты: