Sqlalchemy作用域_会话(..)和作用域_会话(..)之间的差异

Sqlalchemy作用域_会话(..)和作用域_会话(..)之间的差异,sqlalchemy,Sqlalchemy,明确使用范围会话有什么区别: engine = create_engine(url) session = scoped_session(sessionmaker(bind=engine)) session.add(..) session.commit() session.remove() session.add(..) session.commit() session.remove() 并创建作用域_session对象的实例: engine = create_engine(url) ses

明确使用
范围会话
有什么区别:

engine = create_engine(url)
session = scoped_session(sessionmaker(bind=engine))

session.add(..)
session.commit()
session.remove()

session.add(..)
session.commit()
session.remove()
并创建
作用域_session
对象的实例:

engine = create_engine(url)
session = scoped_session(sessionmaker(bind=engine))

session().add(..)
session().commit()
session.remove()

session().add(..)
session().commit()
session.remove()
Sqlachemy始终通过调用
session()
,为同一线程返回相同的会话:

这是在多线程环境中操作连接的正确方法吗?如果是这样,为什么sqlalchemy允许使用
session
而不是
session()。“scoped_session”实际上将在从同一范围调用时返回同一个会话(在几乎每个用例中,范围都是单个用户对网页的请求)

因此,尽管您反复调用session(),但它实际上并没有创建多个会话,而是每次都返回同一个会话

我建议使用大写字母S来表示会话是工厂而不是对象的实例这一事实

这里有更多的文档,比我详细得多:

编辑:两种方式都将访问同一对象。我总是发现从作用域_会话生成实例更为清晰(并非所有工厂都提供这样的功能),但两者都将访问线程本地会话对象


小心使用术语。Python中的生成器是一个非常特殊的东西;“工厂”就是你所说的。“作用域会话”返回一个生成器对象,所以你必须调用生成器来返回一个实例”-最好的部分是我不必这样做,因为这两种方法都有效:
session.commit()
session().commit()
。问题是,有什么区别?也许
Session().commit()
可以在多线程中工作,而
Session.commit()
没有?更新了我的答案。基本上,工厂将自动返回正确的线程本地会话。我发现这个功能不清楚,但每个都有自己的功能。
>> session() is session() 
True
>> session is session() 
False