Обработка сеанса в реляционной БД с SQLAlchemy с использованием многопоточности, объект создан в другом потоке? - PullRequest
0 голосов
/ 24 мая 2019

Создана реляционная база данных через SQLAlchemy.Он работал нормально, пока я не начал вводить потоки.Я немного почитал и обнаружил, что определенный сеанс должен быть уникальным для каждого потока.Способ решения этой проблемы заключался в создании local_sessions, как описано в https://docs.sqlalchemy.org/en/13/orm/contextual.html.

Мой способ борьбы с этим состоял в том, чтобы запускать и закрывать local_session в каждом методе класса, для которого требуется соединение с базой данных.Я настроил класс: DBconnection как:

class DBconnection():

    def __init__(self):
        self.session_factory = sessionmaker(bind=some_engine)
        self.Session = scoped_session(session_factory)

Между тем у меня есть другие классы, такие как класс А., которые запрашивают данные из класса DBconnection.

db_connection = DBconnection()

class A():

    def get_stuff_done(self):
        local_session = db_connection.Session()

        object = local_session.query(MyClass).all()
        # DOING STUFF to object[0]

        local_session.add(object[0])
        local_session.commit()
        local_session.close()

     return object[0]

Я понимаю, что если явызовите Session (), тогда он вернет сеанс с уникальным потоком, и если я закрою этот сеанс, прежде чем покину функцию, я буду в открытом виде.Однако я все еще сталкиваюсь с проблемой "объект был создан в другом потоке".Я что-то не так понял с сессиями?Я думал, что я делал потокобезопасное соединение с помощью scoped_session, но эта ошибка продолжает появляться:

sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in that same thread. The object was created in thread id xxxx and this is thread id yyyy.
...