SQLAlchemy中Session和db.session有什么区别?

Gho*_*ooo 12 python sqlalchemy flask flask-sqlalchemy

在事件映射器级别文档中 它表示Session.add()不支持,但当我尝试在db.session.add(some_object)内部after_insert事件中工作时,例如:

def after_insert_listener(mapper, connection, user):
    global_group = Group.query.filter_by(groupname='global').first()
    a = Association(user,global_group)
    db.session.add(a)

event.listen(User, 'after_insert', after_insert_listener)
Run Code Online (Sandbox Code Playgroud)

基本上任何新用户都应该是global_group的一部分,所以我在after_insert事件中添加了它.我试图插入一个用户,然后检查我的数据库,我找到了用户记录和关联记录.

And*_*ujo 15

让我们检查一下差异:

from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://///Users/dedeco/Documents/tmp/testDb.db'
db = SQLAlchemy(app)

>>>type(db.session)
<class 'sqlalchemy.orm.scoping.scoped_session'>
Run Code Online (Sandbox Code Playgroud)

要么

from sqlalchemy import *
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

some_engine = create_engine('sqlite://///Users/dedeco/Documents/tmp/testDb.db')
Session = sessionmaker(bind=some_engine)
session = Session()

Base = declarative_base()

>>> type(session)
<class 'sqlalchemy.orm.session.Session'>
Run Code Online (Sandbox Code Playgroud)

基本上差异是:

  • 第一种方法是使用为Flask框架开发的API,称为Flask-SQLAlchemy.如果要创建Flask应用程序,则可以选择此选项,因为会话的范围可以由应用程序自动管理.您可以获得许多好处,例如建立单个会话的基础结构,与请求相关联,正确构建并拆除相应的请求结束时拆除.

  • 第二种方式是纯SQLAlchemy应用程序,因此如果您使用库来连接特定数据库,则只能使用SQLAlchemy API,例如,命令行脚本,后台守护程序,GUI界面驱动的应用程序,等等

因此,您可以添加两种方式,例如:

使用Flask-SQLAlchemy:

class User(db.Model):
    __tablename__ = 'users'
    user_id = db.Column(db.Integer(), primary_key = True)
    user_name = db.Column(db.String(80), unique=True)
    def __init__(self, user_name):
        self.user_name = user_name

>>> db.create_all()
>>> u = User('user1')
>>> db.session.add(u)
>>> db.session.commit()
>>> users = db.session.query(User).all()
>>> for u in users:
...     print u.user_name
... 
user1
Run Code Online (Sandbox Code Playgroud)

仅使用SQLAlchemy:

class User(Base):
    __tablename__ = 'users'
    user_id = Column(Integer(), primary_key = True)
    user_name = Column(String(80), unique=True)

>>> u = User()
>>> u.user_name = 'user2'
>>> session.add(u)
>>> session.commit()
>>> users = session.query(User).all()
>>> for u in users:
...     print u.user_name
... 
user1
user2
Run Code Online (Sandbox Code Playgroud)

意识到我在同一个数据库中连接只是为了显示你可以用很多方式添加.

  • 这是否意味着对于 Flask-SQLAlchemy 的情况,我们不需要在 *try except* 中手动关闭会话,因为 Flask 会为我们处理它? (2认同)