@Whey

Как добавлять/удалять новые данные в базе данных?

Есть сайт на котором получается информация при помощи парсинга. Также есть база данных в которой находятся все записи. Как можно отслеживать добавление новых записей или тех, которые удаляются? Думал сделать это через множества, а именно получить все строки из базы данных, и собрать из них одну единую строку множества.
mycursor.execute("SELECT Date, User_Group, NumberPair, Time, NameSubject, Teacher, Audience FROM `schedule`")
myresult = mycursor.fetchall()
new = set()

for row in myresult:
    for s in row:
        st += str(s) + ' '
    new.add(st)
    st = ''

print(new)

В итоге множество имеет следующий вид:
{'29.06.2019 272а 4 13:20 - 14:50 лек. Экономическая теория Шлыкова Л.Н. 107 Н ', 
'25.06.2019 272а 4 13:20 - 14:50 лек. Экономика организации Калугина Н.А. 314 Н '}


Тоже самое проделать с сайтом, и затем получить уникальные строки:
print(new - web) # Добавлена пара
print(web - new) # Удалена пара

В итоге – у меня получилось “отсеять” добавленные/удаленные записи, но тут встает вторая проблема: Как теперь эти данные отправить обратно на сервер если они уже имеют строковый вид. Думал над вариантами с использованием библиотеки re, но так и не добрался до нее. Как можно более рационально добавлять/удалять новые записи в базу данных?
  • Вопрос задан
  • 120 просмотров
Решения вопроса 1
KodyWiremane
@KodyWiremane
Пони, Debian, LEMP, LAN, любитель
На мой непрофессиональный взгляд, можно хранить в дополнительном словаре соответствие st номеру row в myresults, потом пройтись по множеству удалённых строк, по словарю определить для каждой номер row в myresults и построить запрос на удаление, используя значения из row. Это решает проблему удаления.

Вариация — добавить в БД автоинкрементируемый столбец id, в словаре сохранять именно этот id (st→id), тогда запрос на удаление получается гораздо проще.

Для добавления, мне кажется, только парсить строку регуляркой.

import re;

line = '25.06.2019 272\xd0\xb0 4 13:20 - 14:50 \xd0\xbb\xd0\xb5\xd0\xba. \xd0\xad\xd0\xba\xd0\xbe\xd0\xbd\xd0\xbe\xd0\xbc\xd0\xb8\xd0\xba\xd0\xb0 \xd0\xbe\xd1\x80\xd0\xb3\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb7\xd0\xb0\xd1\x86\xd0\xb8\xd0\xb8 \xd0\x9a\xd0\xb0\xd0\xbb\xd1\x83\xd0\xb3\xd0\xb8\xd0\xbd\xd0\xb0 \xd0\x9d.\xd0\x90. 314 \xd0\x9d ';
expr = re.compile('^([0-9.]+) ([0-9\xd0\xb0-\xd1\x8f]+) (\d+) (\d+:\d+) - (\d+:\d+) (.*) (\d+ \xd0\x9d) $');
match = expr.match(line);

for val in match.groups() :
	print(val);


Либо более читаемо,
# -*- coding: utf-8 -*-
# комментарий выше должен быть первой или второй строкой в файле исходника, содержащего юникод (здесь, русские буквы)

import re;

line = '25.06.2019 272а 4 13:20 - 14:50 лек. Экономика организации Калугина Н.А. 314 Н ';
expr = re.compile('^([0-9.]+) ([0-9а-я]+) (\d+) (\d+:\d+) - (\d+:\d+) (.*) (\d+ Н) $');
match = expr.match(line);

for val in match.groups() :
	print(val);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы