Создана реляционная база данных через 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.