В настоящее время я пытаюсь понять, как заставить sqlalchemy работать в потоках.Вот основная задача, которую я назвал хорошей практикой для такого случая использования:
engine=create_engine(SQLITE_URI)
session_factory= sessionmaker(bind=engine)
#I read on the doc that scoped_session was more appropriate for threading
Session= scoped_session(session_factory)
session= Session()
Затем я могу использовать объект session
для доступа к моей базе данных.
Когда я пытаюсь применить этот код в функции, предназначенной для потока, я не вижу разницы в 3 случаях:
- создать новый механизм в функциидля каждого потока
- , передающего Session и создающего `session = Session ()` внутри функции
- , создающего another_session и передающего его в качестве параметра
Донне вижу никакой разницы в исполнении.Однако я хотел бы знать:
- В чем скрытая разница между этими 3 случаями
- Что такое наилучшая практика?
Вот пример кода, если необходимо:
def dummies_in(user):
"""case 1, everything is created in this function"""
engine=create_engine(SQLITE_URI)
session_factory= sessionmaker(bind=engine)
Session= scoped_session(session_factory)
session= Session()
for i in range(5):
user.emails.append(Email(address=f"{n}@{user.name}.com"))
sleep(1)
session.add(user)
session.commit()
Session.remove()
def dummies_middle_in(user,Session):
"""case 2, i pass as parameter the Session object and create a session inside"""
session= Session()
for i in range(5):
user.emails.append(Email(address=f"{n}@{user.name}.com"))
sleep(1)
session.add(user)
session.commit()
Session.remove()
def dummies_in(user,session):
"""case 3, everything is created out this function"""
for i in range(5):
user.emails.append(Email(address=f"{n}@{user.name}.com"))
sleep(1)
session.add(user)
session.commit()
#Session.remove() outside