LINUX.ORG.RU

multiprocessing в SQLAlchemy - помогите побороть

 , ,


0

1

Никак не могу разобраться и победить ошибку.
Делаю несколько процессов, в каждом - работа с БД. На оффтопике работает нормально, а после деплоя на дебиан 8 имею ошибки.

Вот так организованы коннекты:

from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm.session import sessionmaker

from Settings import dbSettings as settings


engine = create_engine('%s://%s:%s@%s:%s/%s' % (
                                                settings['protocol'], 
                                                settings['user'], 
                                                settings['password'], 
                                                settings['host'], 
                                                settings['port'], 
                                                settings['database']))
session_factory = sessionmaker(bind=engine)
Session = scoped_session(session_factory)


class Connection(object):

    @staticmethod
    def getSession():
        return Session()

    @staticmethod
    def getEngine():
        return engine

    @staticmethod
    def remove():
        return
        s = Connection.getSession()
        s.close()
        Session.remove()

    @staticmethod
    def dispose():
        s = Connection.getSession()
        s.close()
        Session.remove()
        engine.dispose()

Т.е. я по коду просто получаю сессию к БД и работаю:

from Connection import Connection
# ...
s = Connection.getSession()
s.query(...).all()

Ошибки лезут типа таких:

Process PaymentsEnrolmentWorker-6:
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    context)
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/base.py", line 1182, in _execute_context
    context)
  File "/usr/local/lib/python3.4/dist-packages/sqlalchemy/engine/default.py", line 470, in do_execute
    cursor.execute(statement, parameters)
psycopg2.OperationalError: SSL error: decryption failed or bad record mac

Гуглил, кто-то пишет, что нужно обязательно remove() делать, кто-то упоминает про dispose()... мне это не помогло, либо я не так делаю.

★★★★★

На каждый процесс отдельное соединение.

Из мелочей:

1. Вот это: '%s://%s:%s@%s:%s/%s' % (...) можно заменить на settings['sqlalchemy.url'] а в url уже пишешь postgresql://user:pass@localhost/database. 2. Класс Connection абсолютно бесполезен и всё только усложняет. Почему нельзя сразу воспользоваться Session и engine напрямую?

anonymous ()
Ответ на: комментарий от anonymous

На каждый процесс отдельное соединение

Переделал. Все равно процессы валятся, когда запускаются несколько. Та же ошибка.

Вот это: '%s://%s:%s@%s:%s/%s' % (...) можно заменить на settings['sqlalchemy.url'] а в url уже пишешь postgresql://user:pass@localhost/database.

Не принципиально. Мне так захотелось.

Класс Connection абсолютно бесполезен и всё только усложняет. Почему нельзя сразу воспользоваться Session и engine напрямую?

ООП же. Я захотел выделить логику управления соединениями в отдельный класс.

bvn13 ★★★★★ ()
Ответ на: комментарий от anonymous

может быть, дело в том, что в дебиане питон 3.4, а на оффтопике (где все работает) 3.6?

bvn13 ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.