Python и sqlite3 внесение изменений в базу данных (СУБД SQLite), практические примеры

preview_player
Показать описание
В этом видео привожу обзор возможностей Python по работе с базами данных. Работать с базами данных
будем с помощью стандартной библиотеки Python, которая называется sqlite3. Библиотека sqlite3 предоставляет высокоуровневый
интерфейс для работы с реляционными базами данных на движке SQLite.

Это вторая часть видео 13 в котором рассказываю как читать, обновлять, удалять данные в таблицах с СУБД SQLite.
Также немного расскажу о типизации данных для SQLite и её особенностях.

В видео использованы следующие аудио материалы:
композиция Timeless исполнитель Constantine 2018г дабстеп.

Подробнее на Портале: PyScientist

Ссылки на предыдущие видео по теме:
Видео 1: Python настройка рабочего пространства, использование PyCharm
Видео 2: Python функции
Видео 3: Python классы
Видео 4: Графический интерфейс Qt для Python, или PyQt
Видео 5: Python компиляция программ, cx_Freeze и другие компиляторы
Видео 6.1: Библиотека Matplotlib создание графиков для анализа данных
Видео 6.2: Библиотека matplotlib и Qt встраивание графиков в графический интерфейс Qt
Видео 7: Matplotlib модуль Animation класс FuncAnimation (автообновление графиков)
Видео 8: Библиотека Matplotlib, отображение графиков функции с использованием библиотеки numexpr (ввод функции из текстовой строки)
Видео 9.1: Классы QListWidget и QListView сопоставительный анализ, простой пример применения QListWidget
Видео 9.2: Класс QListView пример применения с использованием QtCore.QabstractListModel
Видео 10: Python и Excel взаимодействие с excel (библиотеки xlrd, xlwt, openpyxl, win32com)
Видео 11: обзор виджета QTableWidget и практическое использование
Видео №12.1 обзор виджета QStackedWidget использование QComboBox и QPushButton в качестве переключателей
Видео №12.2 Продолжение обзора виджета QStackedWidget использование QToolButton в качестве переключателей, настройка
статического и динамического внешнего вида QToolButton c использованием qss.
Видео 12.3 Python готовое приложение с графическим интерфейсом (GUI) Qt и графической библиотекой Matplotlib (Обзор проекта текущее состояние на июль 2018г).
Видео 13.1 Python и создание базы данных данных на движке СУБД sqlite3 с использованием стандартной библиотеки.
Рекомендации по теме
Комментарии
Автор

Отлично сделанный практический материал. Живо и по делу. Автору - благодарность.

andrewnovikoff
Автор

Спасибо! Это лучшие видео по введению в базы данных на Python, что я находил на Ютубе. Был бы рад, если бы Вы рассказали далее отличия и особенности работы с MySQL и PostgreSQL

yodapunishes
Автор

Сергей, спасибо большое за труд! Нашел для себя много полезной информации. Так держать! Но хочу вставить свои 5 копеек. В Пайтоне считается моветоном конкатенировать строки с помощью плюсов, потому что каждый плюс множит сущности, добавляя переменную и пожирая память. Даже не столько вопрос памяти, сколько быстродейтсвия. Я давно отказался от плюсов и использую f-строки: вместо
query = 'UPDATE' + table + 'SET'
можно просто написать:
query = f'UPDATE {table} SET'
Тем, кто не знает, что такое f-строки: гуглите и обрящете! Я использую их не только вместо конкатенации (сложения строк), но и вместо оператора "%" и метода "format". Это гораздо удобнее и - главное - быстрее!

vladimirmorozoff
Автор

def sqlite3_simple_read_db(data_base, table, column_name = None):
# Соединяемся с базой данных, если базы данных нет создается новая с таким именем
con = sqlite3.connect(data_base)
# Создаем объект курсора
cur = con.cursor()
query_columns = 'pragma table_info('+table+')'
cur.execute(query_columns)
columns_description = cur.fetchall()
columns_names = []
for column in columns_description:


if column_name is None:
query = 'SELECT * FROM '+table
cur.execute(query)
data = cur.fetchall()
else:
query = 'SELECT '+column_name+' FROM '+table
cur.execute(query)
data = cur.fetchall()
new_data = []
for element in data:
new_data.append(element[0])
data = new_data
del(new_data)
print_data_2d(columns_names, data)
cur.close()
con.close()

PyScientist
Автор

Благодарю Вас! Вы сэкономили мне массу времени.

tsoer
Автор

Спасибо огромное за ваши уроки. Изучаю пайтон, уже на уровне джуна нахожусь по всему, кроме sql. Вообще не знал с чего начать. Смотре другие видеоуроки, вообще ниче не понятно, что-то быстро там написали и все, а что за что отвечает вообще не понятно и мотивация теряется. По вашим урокам понятнее. Так что продолжаю учить)

grigoriygusev
Автор

Спасибо за объёмный материал. Познавательно. Подсмотрел на Ютубе вот такую конструкцию:
with sqlite3.connect('test.db') as db:
cursor = db.cursor()

db.commit()
В этом случае я так понимаю соединение с базой после db.commit() закрывается автоматически.

KaJluHuHrpag
Автор

def print_data_2d(columns_names, data):
print(columns_names)
for line in data:
print(line)
print('number of lines in database table is '+str(len(data)))

PyScientist
Автор

Добрый день Сергей, как всегда на высоте ( просто о сложном), пишу на Вашей основе, базу( графическая оболочка на PyQt5 + sqllite) по работе с мед.документаций, пока только локальную. Для использования в Lan, думаю использовать mysql.
Спасибо на труд. Ждем продолжения. С уважением.

АлексФри-зу
Автор

# -*- coding: utf-8 -*-
import sqlite3

def
"""
Функция для создания базы данных с использование СУБД sqlite3
"""
# Соединяемся с базой данных, если базы данных нет создается новая с таким именем
con =

# Создаем объект курсора
cur = con.cursor()
# Создаем таблицу если таблицы не существует
cur.execute('CREATE TABLE IF NOT EXISTS core_fes(Well TEXT, '
'Sample TEXT, '
'Porosity FLOAT, '
'Swr FLOAT, '
'Permeability FLOAT)')
# Добавляем данные в таблицу
cur.execute('INSERT INTO core_fes VALUES("Yellow snake creek", "Sample #666", 25.6, 38, 16)')
# Закрываем курсор
data = ["Green snake creek", "Sample #333", 24, 20, 34]
big_data = []
data1 = ["Brown snake creek", "Sample #111", 15, 2, 32]
data2 = ["Dark snake creek", "Sample #222", 20, 17, 55]
big_data.append(data1)
big_data.append(data2)

cur.execute('INSERT INTO core_fes VALUES(?, ?, ?, ?, ?)', data)
for data_unit in big_data:
cur.execute('INSERT INTO core_fes VALUES(?, ?, ?, ?, ?)', data_unit)
cur.close()
# Подтверждаем внесение данных в таблицу (другими словами записываем изменения)
con.commit()

PyScientist
Автор

def sqlite3_simple_delete_table(data_base, table):
# Соединяемся с базой данных, если базы данных нет создается новая с таким именем
con = sqlite3.connect(data_base)
# Создаем объект курсора
cur = con.cursor()
query = 'DROP TABLE IF EXISTS '+table
cur.execute(query)
cur.close()
con.close()

PyScientist
Автор

def sqlite3_simple_delete_record(data_base, table, id_column, record_id):
# Соединяемся с базой данных, если базы данных нет создается новая с таким именем
con = sqlite3.connect(data_base)
# Создаем объект курсора
cur = con.cursor()
query = 'DELETE FROM '+table+' WHERE '+id_column+" = '"+record_id+"'"
cur.execute(query)
con.commit()
cur.close()
con.close()

PyScientist
Автор

def sqlite3_update_record(data_base, table, id_column, record_id, param_column, param_val):
# Соединяемся с базой данных, если базы данных нет создается новая с таким именем
con = sqlite3.connect(data_base)
# Создаем объект курсора
cur = con.cursor()
query = 'UPDATE '+table+' SET WHERE '+id_column+" = '"+str(record_id)+"'"
cur.execute(query)
con.commit()
cur.close()
con.close()

PyScientist
Автор

Здрасте! Прошо уже 8 месяцев, пора бы 4 видос))

vadymkozlovskyijr
Автор

Я попробовал в своей программе создавать и закрывать подключение и курсор только один раз, а в функциях вызываю уже имеющийся экземпляр курсора. Вроде работает...) Есть подозрение, что подключение к БД может быть очень затратным по времени, потому что здесь есть обращение к диску. А любое чтение с диска происходит очень медленно в сравнении с кодом, который выполняется в RAM. Поэтому я один раз создаю подключение и курсор, и один раз их закрываю. Не знаю, может, для Ваших целей такой подход не подойдет (пардоньте за тавтологию) :-)

vladimirmorozoff
Автор

if __name__ == '__main__':
data_base =
table = 'core_fes'
id_column = 'Sample'
record_id = 'Sample #333'
param_column = 'Porosity'
param_val = 9


#sqlite3_simple_delete_table(data_base, table)
#sqlite3_simple_delete_record(data_base, table, id_column, record_id)
sqlite3_update_record(data_base, table, id_column, record_id, param_column, param_val)
sqlite3_simple_read_db(data_base, table)

PyScientist
Автор

Здравствуйте! Можно уточнить, как можно получить из двух списков словарь, где список1 это ключи (поля таблицы sql) и список2 это значения (значения полей таблицы)

abu
Автор

Странная логика в функции удаления записей. Получается если в таблице несколько одинаковых значений, то сразу удалятся все строки с этим значением. Например удалятся все строки с образцом 'Sample #666'.

predatel_rodini
Автор

Здравствуйте, когда пытаюсь выполнить код query_columns = 'pragma_table_info('+table+')', пишет sqlite3.OperationalError: near "pragma_table_info": syntax error. В чем проблема?

ОлексійСтогній-шо
Автор

А не проще ли использовать .format() чем постоянно разрывать строку?

username-usernamov