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

  Рет қаралды 8,702

PyScientist

PyScientist

Күн бұрын

Пікірлер
@andrewnovikoff
@andrewnovikoff 4 жыл бұрын
Отлично сделанный практический материал. Живо и по делу. Автору - благодарность.
@yodapunishes
@yodapunishes 5 жыл бұрын
Спасибо! Это лучшие видео по введению в базы данных на Python, что я находил на Ютубе. Был бы рад, если бы Вы рассказали далее отличия и особенности работы с MySQL и PostgreSQL
@PyScientist
@PyScientist 6 жыл бұрын
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: columns_names.append(column[1]) 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()
@tsoer2976
@tsoer2976 4 жыл бұрын
Благодарю Вас! Вы сэкономили мне массу времени.
@PyScientist
@PyScientist 4 жыл бұрын
Пожалуйста, за тем и делал)
@vladimirmorozoff8153
@vladimirmorozoff8153 5 жыл бұрын
Сергей, спасибо большое за труд! Нашел для себя много полезной информации. Так держать! Но хочу вставить свои 5 копеек. В Пайтоне считается моветоном конкатенировать строки с помощью плюсов, потому что каждый плюс множит сущности, добавляя переменную и пожирая память. Даже не столько вопрос памяти, сколько быстродейтсвия. Я давно отказался от плюсов и использую f-строки: вместо query = 'UPDATE' + table + 'SET' можно просто написать: query = f'UPDATE {table} SET' Тем, кто не знает, что такое f-строки: гуглите и обрящете! Я использую их не только вместо конкатенации (сложения строк), но и вместо оператора "%" и метода "format". Это гораздо удобнее и - главное - быстрее!
@PyScientist
@PyScientist 5 жыл бұрын
Владимир, спасибо за ценный комментарий, раньше знал только про %, не использовал % здесь для простоты понимания основной темы. Про f не вкурсе был. Попробую переписать кое какие свои проги, проверить как влияет на ресурсопотребление.
@grigoriygusev4159
@grigoriygusev4159 4 жыл бұрын
Спасибо огромное за ваши уроки. Изучаю пайтон, уже на уровне джуна нахожусь по всему, кроме sql. Вообще не знал с чего начать. Смотре другие видеоуроки, вообще ниче не понятно, что-то быстро там написали и все, а что за что отвечает вообще не понятно и мотивация теряется. По вашим урокам понятнее. Так что продолжаю учить)
@PyScientist
@PyScientist 6 жыл бұрын
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)))
@KaJluHuHrpag
@KaJluHuHrpag 5 жыл бұрын
Спасибо за объёмный материал. Познавательно. Подсмотрел на Ютубе вот такую конструкцию: with sqlite3.connect('test.db') as db: cursor = db.cursor() cursor.execute(.....) db.commit() В этом случае я так понимаю соединение с базой после db.commit() закрывается автоматически.
@АлексФри-з2у
@АлексФри-з2у 6 жыл бұрын
Добрый день Сергей, как всегда на высоте ( просто о сложном), пишу на Вашей основе, базу( графическая оболочка на PyQt5 + sqllite) по работе с мед.документаций, пока только локальную. Для использования в Lan, думаю использовать mysql. Спасибо на труд. Ждем продолжения. С уважением.
@PyScientist
@PyScientist 6 жыл бұрын
Спасибо на добром слове, сегодня завтра, будет видео по работе с изображениями с использованием базы данных. Очень рад, что Вам это помогает в практических задачах. Это воодушевляет, что не в стол пишу.)
@PyScientist
@PyScientist 6 жыл бұрын
# -*- coding: utf-8 -*- import sqlite3 def sqlite3_simple_example_create_db(): """ Функция для создания базы данных с использование СУБД sqlite3 """ # Соединяемся с базой данных, если базы данных нет создается новая с таким именем con = sqlite3.connect('./test_data/PyScientist_base.db') # Создаем объект курсора 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
@PyScientist 6 жыл бұрын
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()
@vladimirmorozoff8153
@vladimirmorozoff8153 5 жыл бұрын
Я попробовал в своей программе создавать и закрывать подключение и курсор только один раз, а в функциях вызываю уже имеющийся экземпляр курсора. Вроде работает...) Есть подозрение, что подключение к БД может быть очень затратным по времени, потому что здесь есть обращение к диску. А любое чтение с диска происходит очень медленно в сравнении с кодом, который выполняется в RAM. Поэтому я один раз создаю подключение и курсор, и один раз их закрываю. Не знаю, может, для Ваших целей такой подход не подойдет (пардоньте за тавтологию) :-)
@PyScientist
@PyScientist 5 жыл бұрын
Да только нужно не забывать записывать в базу.) con.commit
@PyScientist
@PyScientist 6 жыл бұрын
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
@PyScientist 6 жыл бұрын
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 '+param_column+'='+str(param_val)+' WHERE '+id_column+" = '"+str(record_id)+"'" cur.execute(query) con.commit() cur.close() con.close()
@predatel_rodini
@predatel_rodini 6 жыл бұрын
Странная логика в функции удаления записей. Получается если в таблице несколько одинаковых значений , то сразу удалятся все строки с этим значением. Например удалятся все строки с образцом 'Sample #666'.
@PyScientist
@PyScientist 6 жыл бұрын
Подрузамевается, что значения в этом столбце уникальны для каждой записи в таблице. Вообще полностью с вами согласен, нужно делать более сложную структуру, но это уже под конкретные цели. Сдесь же попытался показать общую концепцию.
@vadymkozlovskyijr5063
@vadymkozlovskyijr5063 5 жыл бұрын
Здрасте! Прошо уже 8 месяцев, пора бы 4 видос))
@PyScientist
@PyScientist 5 жыл бұрын
Для порядка надо сделать, спасибо за напомигание! В других видео (некоторых из последующих) кратко касаюсь этой темы, но конечно она не раскрыьа так как надо).
@roulette6970
@roulette6970 5 жыл бұрын
/все еще ждет/ :")
@PyScientist
@PyScientist 5 жыл бұрын
@@roulette6970 ушёл от темы немного, никак назад не вернусь(
@abu7537
@abu7537 3 жыл бұрын
Здравствуйте! Можно уточнить, как можно получить из двух списков словарь, где список1 это ключи (поля таблицы sql) и список2 это значения (значения полей таблицы)
@PyScientist
@PyScientist 3 жыл бұрын
Очень просто) Dict = {} for x in range(len(list1)): Dict[list1[x]]=list2[x]
@abu7537
@abu7537 3 жыл бұрын
@@PyScientist спасибо большое
@PyScientist
@PyScientist 6 жыл бұрын
if __name__ == '__main__': data_base = './test_data/PyScientist_base.db' table = 'core_fes' id_column = 'Sample' record_id = 'Sample #333' param_column = 'Porosity' param_val = 9 #sqlite3_simple_example_create_db() #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)
@username-usernamov
@username-usernamov 6 жыл бұрын
А не проще ли использовать .format() чем постоянно разрывать строку?
@PyScientist
@PyScientist 6 жыл бұрын
Да согласен, если только не очень длинное выражение. Формат некоторые не знают, поэтому так пишу, чтобы не путать. Спасибо за комментарий, вероятно стоит показать пример с использованием .format и дальше на него ссылаться.
@ОлексійСтогній-ш4о
@ОлексійСтогній-ш4о 4 жыл бұрын
Здравствуйте, когда пытаюсь выполнить код query_columns = 'pragma_table_info('+table+')', пишет sqlite3.OperationalError: near "pragma_table_info": syntax error. В чем проблема?
@PyScientist
@PyScientist 4 жыл бұрын
Синтаксис sql нарушили 'pragma table_info('+table+')' без нижнего подчеркивания. кроме того если у вас python 3 рекомендую использовать F строки, например, query_columns = F'pragma_table_info('{table}')' погуглите если небудет ясно с моего примера. При использовании с запросами они более безопасны и писать проще.
@kopeev2833
@kopeev2833 5 жыл бұрын
Было бы очень удобно, если бы вы загружали файл с этой программой. Часто не успеваешь писать, и даже если успел, и выходит ошибка, очень сложно найти ее, т. К. На видео не видно всей программы
@PyScientist
@PyScientist 5 жыл бұрын
День добрый, я стараюсь прикладывать код либо в комментариях, либо выкладываю на сайт архив проекта. Вероятно стоит под каждую видео-записку готовить архив проекта с кодом. Спасибо вам за комментарий!
@PyScientist
@PyScientist 5 жыл бұрын
Да, для этого видео код выложен в первых комментариях!
@ПростоЮзер-ы2и
@ПростоЮзер-ы2и 4 жыл бұрын
У меня есть дискорд бот и при временном муте я записываю ник, время, причину. В конце мут снимается (через время, указанное при исполнении команды) и мне нужно удалять строку в базе данных, которую я создавал ранее. Как это можно реализовать? Как я понял, в начале нужно записать в переменную ID строки, а потом удалить по ID строки, но у меня ничего не получается. Подскажите, пожалуйста, как это можно реализовать.
@PyScientist
@PyScientist 4 жыл бұрын
Не совсем понял как генерируется id при записи в базу, вернее как вы ищете то что должно быть удалено? На само деле необязательно id использовать. Можно использовать любой столбец. Например, искать, что нужно удалить по временному тегу (в столбце со временем записи). То есть удалять в автомате записи сформированные в какой-то определенный момент времени.
@ПростоЮзер-ы2и
@ПростоЮзер-ы2и 4 жыл бұрын
@@PyScientist у меня например есть переменная member, которая записана в базу данных. По ней можно удалить всю строку? (member, time, reason). Для примера могу приложить всю функцию, если нужно
@PyScientist
@PyScientist 4 жыл бұрын
То есть у Вас вопрос связан с проблемой самого удаления. Сам запрос на удаления достаточно прост, и описан в видео. В частности для вашего случая может быть использован запрос DELETE FROM 'таблица в базе данных' WHERE 'название колонки где member' = 'значение строки с которым надо удалить'
@_sergeevich5827
@_sergeevich5827 6 жыл бұрын
норм
1% vs 100% #beatbox #tiktok
01:10
BeatboxJCOP
Рет қаралды 67 МЛН
Python class example of text bot (PyCharm IDE)
19:12
PyScientist
Рет қаралды 6 М.
Как в Python писать программы с интерфейсом?
19:23
Хауди Хо™ - Просто о мире IT!
Рет қаралды 812 М.
1% vs 100% #beatbox #tiktok
01:10
BeatboxJCOP
Рет қаралды 67 МЛН