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

时间:2015-11-12 17:59:05

标签: python flask sqlalchemy flask-sqlalchemy

在事件映射器级别docs 它表示不支持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)

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

1 个答案:

答案 0 :(得分:8)

让我们检查一下差异:

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'>

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'>

基本上区别在于:

  • 第一种方法是使用为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

仅使用 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

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