Форум программистов, компьютерный форум CyberForum.ru

Python: Web

Войти
Регистрация
Восстановить пароль
 
Tiger20
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 26
#1

Python запись в базу данных Mysql - Python

15.12.2016, 16:24. Просмотров 365. Ответов 4
Метки нет (Все метки)

Привет всем.

Помогите дописать код.
T3:
Внизу код, он работает так, пишет лог в базу.
Но суть в том что он записывает все запросы тем самым заспамливает базу.
Помогите подправить, чтобы он проверял на наличие записи по двум параметрам: (ip, port,).
Если есть запись в базе с этими параметрами чтобы он не писал ее повторно. То есть избавиться от дубликатов.

Кликните здесь для просмотра всего текста

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def mysql_logscs(ipcs, portcs):
        timey = datetime.datetime.now().strftime('%Y')
        timem = datetime.datetime.now().strftime('%m')
        timed = datetime.datetime.now().strftime('%d')
        timeh = datetime.datetime.now().strftime('%H')
        timemin = datetime.datetime.now().strftime('%M')
        times = datetime.datetime.now().strftime('%S')
        attempts = 0
        while attempts < 1:
                try:
            host,name,user,password,table = cfg.get("LOG","HOST"),cfg.get("LOG","NAME"),cfg.get("LOG","USER"),cfg.get("LOG","PASSWORD"),cfg.get("LOG","TABLE")
                        db = MySQLdb.connect(host=host,user=user,passwd=password,db=name)
                        c = db.cursor()
                        c.execute("INSERT INTO MS01 (timeyear, timemonth, timeday, timehour, timeminute, timesecond, ip, port, type) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)", (timey, timem, timed, timeh, timemin, times, ipcs, portcs, "cs"))
                        c.close()
            attempts += 1
                except MySQLdb.Error, e:
                        print "Not successfully connected and update log data. Retry to connect...5 Seconds."
                        print "Error: %s" %e
                        time.sleep(5)
        thread.exit()


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

Добавлено через 33 минуты
Ребята немного дополнения.
Не по двум параметрам а по трем: (timeday, ip, port)

Добавлено через 15 часов 11 минут
Есть у кого какие идеи?
Кто поможет, дам соточку на пивко.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2016, 16:24     Python запись в базу данных Mysql
Посмотрите здесь:

Установка библиотеки Python для MySql Python
Существует ли готовый набор python + apache + mysql для установки? Python
Как создать страницу для добавления новых записей в базу данных? Python
Python Отобразить поля для ввода в базу данных
Как просмотреть базу данных в эклипсе? Python
Python Как правильно 'подключить' уже существующую базу данных к Django
Python Сохранить данные запроса в базу данных
Python-requests Python
Парсинг и обработка данных на python Python
Ошибка при запуске web-приложения на Python + Flask + MySQL Python
Python Добавление данных в таблицу БД в цикле for. sqlalchemy PYTHON
Многопоточность в Python Python

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jabbson
Модератор
Эксперт по компьютерным сетям
3060 / 2161 / 427
Регистрация: 03.11.2009
Сообщений: 6,841
Записей в блоге: 3
16.12.2016, 20:15     Python запись в базу данных Mysql #2
если таблица выглядит вот так:

Код
mysql> select * from access_logs;
+----+-------+------------+-------------+------------+
| id | login | ip_address | port_number | time_stamp |
+----+-------+------------+-------------+------------+
|  1 | user1 | 2130706433 |          80 | 1481907621 |
|  2 | user2 | 2130706434 |        8080 | 1481907660 |
|  3 | user3 | 2130706435 |         443 | 1481907667 |
+----+-------+------------+-------------+------------+
3 rows in set (0.00 sec)
то, для того, чтобы нельзя было записать в таблицу строку с уже существующими ip, port и time_stamp, можно создать таблицу c указанием UNIQUE KEY

UNIQUE KEY `uniq_log` (`time_stamp`,`ip_address`,`port_number`)

после этого инсерт будет ругаться на дубликат

Код
mysql> INSERT INTO access_logs (login, ip_address, port_number, time_stamp) VALUES ('user1', 2130706433, 80, 1481907621);
ERROR 1062 (23000): Duplicate entry '1481907621-2130706433-80' for key 'uniq_log'
и чтобы этого избежать можно вместо INSERT сделать INSERT IGNORE

Код
mysql> INSERT IGNORE INTO access_logs (login, ip_address, port_number, time_stamp) VALUES ('user1', 2130706433, 80, 1481907621);
Query OK, 0 rows affected, 1 warning (0.01 sec)
Но с моей колокольни это выглядит, как будто Вы пытаетесь лечить симптомы, вместо болезни.
Tiger20
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 26
16.12.2016, 23:07  [ТС]     Python запись в базу данных Mysql #3
Возможно вы не так меня поняли, или я плохо объяснил.

Немного описания:
У меня стоит серверная программа на python, к ней подсоединяются клиенты.
И прога пишет лог в базу каждого соединения. Но есть недоброжелатели, который ддосят сервер.
Они забивают базу по 500к запросов в день. В базе хранятся записи за неделю.
Есть также веб часть, которая показывает статистику. Так вот после таких ддосов, веб часть начинает тормозить.


Так вот в первом посте код python. Который записывает лог соединения в базу.
Мне надо его подправить, чтобы он сперва делал проверку, существует запись или нет, а потом записывал если записи нет.
Мне нужно исправить python код.


Я думаю что это как раз и не симптом, а именно болезнь.

Как выглядит таблица.
Миниатюры
Python запись в базу данных Mysql  
Jabbson
Модератор
Эксперт по компьютерным сетям
3060 / 2161 / 427
Регистрация: 03.11.2009
Сообщений: 6,841
Записей в блоге: 3
16.12.2016, 23:26     Python запись в базу данных Mysql #4
Для начала, чтобы база росла не так быстро, можно попробовать оптимизировать архитектуру - например использовать соответствующий тип данных для даты, переделать ip в целое. Потом, если кто-то ломится слишком сильно, возможно стоит не логи редактировать, а определять подобных "недоброжелателей" еще на подлете и закрывать доступ средствами сервера?

Что думаете про индексацию по трем полям, как я сделал выше?
Tiger20
0 / 0 / 0
Регистрация: 27.06.2015
Сообщений: 26
17.12.2016, 00:12  [ТС]     Python запись в базу данных Mysql #5
Jabbson,

Я забыл уточнить, что я в языке python полный нуль. Ну и mysql тоже.
По этому и выложил код, чтобы его смогли отредактировать.

По поводу что написано выше, это все было бы возможно, если я хоть чутка разбирался.
Сперва хотя бы от дублирующихся записей избавится.
Yandex
Объявления
17.12.2016, 00:12     Python запись в базу данных Mysql
Ответ Создать тему
Опции темы

Текущее время: 15:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru