在事件映射器级别的文档中,它说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
事件中添加了它。我尝试插入一个用户,然后将其检入数据库,并找到了用户记录和关联记录。
让我们检查一下差异:
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应用程序,则可以选择该选项,因为Session的范围可以由您的应用程序自动管理。您有许多好处,例如用于建立与请求相关联的单个会话的基础结构,该基础结构被正确构造并在请求结束时被拆除。
第二种方法是纯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
意识到我在同一数据库中进行连接只是为了表明您可以使用多种方式添加。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句