Использование SQLalchemy в функции для правильной работы с потоками: о движке и создании сеанса - PullRequest
0 голосов
/ 18 марта 2019

В настоящее время я пытаюсь понять, как заставить 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 случаях:

  1. создать новый механизм в функциидля каждого потока
  2. , передающего Session и создающего `session = Session ()` внутри функции
  3. , создающего 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
...