Отлично сделанный практический материал. Живо и по делу. Автору - благодарность.
@yodapunishes5 жыл бұрын
Спасибо! Это лучшие видео по введению в базы данных на Python, что я находил на Ютубе. Был бы рад, если бы Вы рассказали далее отличия и особенности работы с MySQL и PostgreSQL
@PyScientist6 жыл бұрын
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()
@tsoer29764 жыл бұрын
Благодарю Вас! Вы сэкономили мне массу времени.
@PyScientist4 жыл бұрын
Пожалуйста, за тем и делал)
@vladimirmorozoff81535 жыл бұрын
Сергей, спасибо большое за труд! Нашел для себя много полезной информации. Так держать! Но хочу вставить свои 5 копеек. В Пайтоне считается моветоном конкатенировать строки с помощью плюсов, потому что каждый плюс множит сущности, добавляя переменную и пожирая память. Даже не столько вопрос памяти, сколько быстродейтсвия. Я давно отказался от плюсов и использую f-строки: вместо query = 'UPDATE' + table + 'SET' можно просто написать: query = f'UPDATE {table} SET' Тем, кто не знает, что такое f-строки: гуглите и обрящете! Я использую их не только вместо конкатенации (сложения строк), но и вместо оператора "%" и метода "format". Это гораздо удобнее и - главное - быстрее!
@PyScientist5 жыл бұрын
Владимир, спасибо за ценный комментарий, раньше знал только про %, не использовал % здесь для простоты понимания основной темы. Про f не вкурсе был. Попробую переписать кое какие свои проги, проверить как влияет на ресурсопотребление.
@grigoriygusev41594 жыл бұрын
Спасибо огромное за ваши уроки. Изучаю пайтон, уже на уровне джуна нахожусь по всему, кроме sql. Вообще не знал с чего начать. Смотре другие видеоуроки, вообще ниче не понятно, что-то быстро там написали и все, а что за что отвечает вообще не понятно и мотивация теряется. По вашим урокам понятнее. Так что продолжаю учить)
@PyScientist6 жыл бұрын
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)))
@KaJluHuHrpag5 жыл бұрын
Спасибо за объёмный материал. Познавательно. Подсмотрел на Ютубе вот такую конструкцию: with sqlite3.connect('test.db') as db: cursor = db.cursor() cursor.execute(.....) db.commit() В этом случае я так понимаю соединение с базой после db.commit() закрывается автоматически.
@АлексФри-з2у6 жыл бұрын
Добрый день Сергей, как всегда на высоте ( просто о сложном), пишу на Вашей основе, базу( графическая оболочка на PyQt5 + sqllite) по работе с мед.документаций, пока только локальную. Для использования в Lan, думаю использовать mysql. Спасибо на труд. Ждем продолжения. С уважением.
@PyScientist6 жыл бұрын
Спасибо на добром слове, сегодня завтра, будет видео по работе с изображениями с использованием базы данных. Очень рад, что Вам это помогает в практических задачах. Это воодушевляет, что не в стол пишу.)
@PyScientist6 жыл бұрын
# -*- 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()
@PyScientist6 жыл бұрын
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()
@vladimirmorozoff81535 жыл бұрын
Я попробовал в своей программе создавать и закрывать подключение и курсор только один раз, а в функциях вызываю уже имеющийся экземпляр курсора. Вроде работает...) Есть подозрение, что подключение к БД может быть очень затратным по времени, потому что здесь есть обращение к диску. А любое чтение с диска происходит очень медленно в сравнении с кодом, который выполняется в RAM. Поэтому я один раз создаю подключение и курсор, и один раз их закрываю. Не знаю, может, для Ваших целей такой подход не подойдет (пардоньте за тавтологию) :-)
@PyScientist5 жыл бұрын
Да только нужно не забывать записывать в базу.) con.commit
@PyScientist6 жыл бұрын
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()
@PyScientist6 жыл бұрын
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_rodini6 жыл бұрын
Странная логика в функции удаления записей. Получается если в таблице несколько одинаковых значений , то сразу удалятся все строки с этим значением. Например удалятся все строки с образцом 'Sample #666'.
@PyScientist6 жыл бұрын
Подрузамевается, что значения в этом столбце уникальны для каждой записи в таблице. Вообще полностью с вами согласен, нужно делать более сложную структуру, но это уже под конкретные цели. Сдесь же попытался показать общую концепцию.
@vadymkozlovskyijr50635 жыл бұрын
Здрасте! Прошо уже 8 месяцев, пора бы 4 видос))
@PyScientist5 жыл бұрын
Для порядка надо сделать, спасибо за напомигание! В других видео (некоторых из последующих) кратко касаюсь этой темы, но конечно она не раскрыьа так как надо).
@roulette69705 жыл бұрын
/все еще ждет/ :")
@PyScientist5 жыл бұрын
@@roulette6970 ушёл от темы немного, никак назад не вернусь(
@abu75373 жыл бұрын
Здравствуйте! Можно уточнить, как можно получить из двух списков словарь, где список1 это ключи (поля таблицы sql) и список2 это значения (значения полей таблицы)
@PyScientist3 жыл бұрын
Очень просто) Dict = {} for x in range(len(list1)): Dict[list1[x]]=list2[x]
А не проще ли использовать .format() чем постоянно разрывать строку?
@PyScientist6 жыл бұрын
Да согласен, если только не очень длинное выражение. Формат некоторые не знают, поэтому так пишу, чтобы не путать. Спасибо за комментарий, вероятно стоит показать пример с использованием .format и дальше на него ссылаться.
@ОлексійСтогній-ш4о4 жыл бұрын
Здравствуйте, когда пытаюсь выполнить код query_columns = 'pragma_table_info('+table+')', пишет sqlite3.OperationalError: near "pragma_table_info": syntax error. В чем проблема?
@PyScientist4 жыл бұрын
Синтаксис sql нарушили 'pragma table_info('+table+')' без нижнего подчеркивания. кроме того если у вас python 3 рекомендую использовать F строки, например, query_columns = F'pragma_table_info('{table}')' погуглите если небудет ясно с моего примера. При использовании с запросами они более безопасны и писать проще.
@kopeev28335 жыл бұрын
Было бы очень удобно, если бы вы загружали файл с этой программой. Часто не успеваешь писать, и даже если успел, и выходит ошибка, очень сложно найти ее, т. К. На видео не видно всей программы
@PyScientist5 жыл бұрын
День добрый, я стараюсь прикладывать код либо в комментариях, либо выкладываю на сайт архив проекта. Вероятно стоит под каждую видео-записку готовить архив проекта с кодом. Спасибо вам за комментарий!
@PyScientist5 жыл бұрын
Да, для этого видео код выложен в первых комментариях!
@ПростоЮзер-ы2и4 жыл бұрын
У меня есть дискорд бот и при временном муте я записываю ник, время, причину. В конце мут снимается (через время, указанное при исполнении команды) и мне нужно удалять строку в базе данных, которую я создавал ранее. Как это можно реализовать? Как я понял, в начале нужно записать в переменную ID строки, а потом удалить по ID строки, но у меня ничего не получается. Подскажите, пожалуйста, как это можно реализовать.
@PyScientist4 жыл бұрын
Не совсем понял как генерируется id при записи в базу, вернее как вы ищете то что должно быть удалено? На само деле необязательно id использовать. Можно использовать любой столбец. Например, искать, что нужно удалить по временному тегу (в столбце со временем записи). То есть удалять в автомате записи сформированные в какой-то определенный момент времени.
@ПростоЮзер-ы2и4 жыл бұрын
@@PyScientist у меня например есть переменная member, которая записана в базу данных. По ней можно удалить всю строку? (member, time, reason). Для примера могу приложить всю функцию, если нужно
@PyScientist4 жыл бұрын
То есть у Вас вопрос связан с проблемой самого удаления. Сам запрос на удаления достаточно прост, и описан в видео. В частности для вашего случая может быть использован запрос DELETE FROM 'таблица в базе данных' WHERE 'название колонки где member' = 'значение строки с которым надо удалить'