根据文档,我们应该对对象使用以下模式sessionmaker:
Session = sessionmaker(engine)
with Session.begin() as session:
session.add(some_object)
Run Code Online (Sandbox Code Playgroud)
在多线程环境中,我们也应该使用单线程scoped_session并共享它。因此,在我的程序中__init__.py,我创建了一个并将其导入到程序中的其他位置:
engine = create_engine(config.SQLALCHEMY_DATABASE_URI)
Session = scoped_session(sessionmaker(bind=engine))
Run Code Online (Sandbox Code Playgroud)
问题是,我应该如何结合这两种方法?这似乎是建议的方式,但它出错了:
from myapp import Session
with Session.begin() as session:
query_result = session.query(MyModel).all()
----
Exception has occurred: AttributeError
'SessionTransaction' object has no attribute 'query'
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法并且它有效,但它似乎不遵循文档,而且我担心它会破坏一些不明显的东西。谁能确认这是否正确?
from myapp import Session
with Session() as session, session.begin():
query_result = session.query(MyModel).all()
Run Code Online (Sandbox Code Playgroud)
我一直在查看其他回复,但几乎没有看到解决具体问题的答案。