Форум сайта python.su
Есть проект на Djnago + UWSGI, который так же используется в качестве задач (аналог celery).
python 3 , в качестве драйвера к базе данных - mysqlclient
Необходимо на одной из страниц подключатся к базе данных на другом сервере и вытаскивать из нее данные.
tasks.py , который осуществляет вызов
from project.redmine.agregator import Redmine @task(executor=TaskExecutor.SPOOLER, retry_count=1, retry_timeout=5) def redmine_data_update(): r = Redmine() r.import_tasks()
import logging log = logging.getLogger('tasks') class Redmine: db = None def __init__(self): self.db = _mysql.connect(host=settings.REDMINE_DB_HOST, db=settings.REDMINE_DB_NAME, user=settings.REDMINE_DB_USER, passwd=settings.REDMINE_DB_PASS) self.db.query("SET NAMES utf8;") self.db.query("SET CHARACTER SET utf8;") self.db.query("SET character_set_connection=utf8;") log.info('MySQL connection to redmine opened.') def __del__(self): self.db.close() log.info('MySQL connection to redmine closed.') def import_tasks(self): query = "SELECT ... сам запрос" try: self.db.query(query) res = self.db.use_result() rs = list(RedmineTasks.objects.filter().values_list('task_id', flat=True)) except Exception as e: log.error('MySQL error: %s' % e) return row = res.fetch_row()
(tasks:24) MySQL connection to redmine opened. (tasks:28) MySQL connection to redmine closed.
(tasks:24) MySQL connection to redmine opened. (tasks:48) MySQL error: (2006, 'MySQL server has gone away')
Офлайн
Сделайте открытие/закрытие соединения в блоке try … finally … вместо __init__/__del__, это вам не c++.
И, кстати, django же умеет соединения к разным базам из коробки, зачем так грубо - настройки подключения в коде.
Офлайн
Офлайн
PooHТам просто несколько разных методов в классе, которые вытягивают разные данные. Хотелось бы в конструкторе открыть соединение, а в деструкторе закрыть.
Сделайте открытие/закрытие соединения в блоке try … finally … вместо __init__/__del__, это вам не c++.
И, кстати, django же умеет соединения к разным базам из коробки, зачем так грубо - настройки подключения в коде.
Офлайн
VadimKНу поместите вызовы этих методов в один try .. finally или сделайте класс менеджером контекста в __enter__ откройте в __exit__ закройте.
Там просто несколько разных методов в классе, которые вытягивают разные данные. Хотелось бы в конструкторе открыть соединение, а в деструкторе закрыть.
VadimKПотому что на объект могут быть ссылки. Еще раз говорю - это не c++, __del__ может быть вызван когда счетчик ссылок на объект обнуляется, а если ссылки циклические (один объект на другой, а другой на первый), то когда сборщик мусора придет. А если процесс завершится раньше чем счетчики обнулятся, то может вообще не вызваться. Честно говоря, не скажу как тут соединение к базе будет закрыто, как бы не по таймауту.
Но __del__ почему то не всегда вызывается.
VadimKЯ и вижу насколько удобнее, вместо готового пула пилите велосипед(гарна штука лисопед, попа едет, ноги нет). И настройки вместо конфига расползаются по коду.
А по поводу соединения - просто в данном случае удобнее. Так как нигде более та база не используется и нет смысла ее в проект тащить.
Отредактировано PooH (Июнь 28, 2017 18:30:38)
Офлайн