flask_sqlalchemy的session用法疑问
flask_sqlalchemy的官方文档用法如下:
>>> from yourapplication import User
>>> admin = User(username='admin', email='admin@example.com')
>>> guest = User(username='guest', email='guest@example.com')
>>> db.session.add(admin)
>>> db.session.add(guest)
>>> db.session.commit()
这里db.session可以直接使用,它是一个sqlalchemy.orm.scoping.scoped_session
对象,但是我们看过sqlalchemy的教程就知道,sqlalchemy里推荐的用法需要把session实例化使用:
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session, sessionmaker
engine = create_engine(uri, convert_unicode=True)
session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
sess = session()
sess.add(admin)
sess.commit()
sess.close()
此时的sess是一个sqlalchemy.orm.session.SignallingSession
对象,用法和之前差不多,但是具体的区别是什么呢?
其实flask_sqlalchemy中使用session之前也是做了session实例化的,只不过这个动作通过proxy的编程技巧被隐藏在scoped_session类中了。《sqlalchemy 1.4 Documentation》中会话章节有提及这种隐式方法访问:
flask_sqlalchemy帮助使用者简化了session实例化的过程,具体的做法是通过scoped_session._call_ 这个魔术函数来自动完成session实例化的,这里是代码实现片段: