2015-11-12 3 views
5
イベントマッパーレベルで

docs それはSession.add()がサポートされていないと言うが、私はそれが働いたdb.session.add(some_object)after_insert内部イベント、たとえば行うことをしようとしたとき:SQLAlchemyのSessionとdb.sessionの違いは何ですか?

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イベントに追加しました。私は、ユーザーを挿入しようとし、私のデータベースにチェックインし、私はユーザーレコードと関連付けレコードを発見した。

+2

使用した例についてもう少し説明してください。たとえば、あなたは「働いた」と言った。あなたは「働いた」とはどういう意味ですか? –

+0

もう一度質問を確認してください、私はそれを例で更新しました。 – Ghooo

答えて

4

のはdiferencesを確認してみましょう:

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

基本的に違いがある:あなたがフラスコフレームワーク用に開発APIを使用している最初のように

  • Flask-SQLAlchemyと呼ばれます。 Flaskアプリケーションを作成している場合、セッションのスコープはアプリケーションによって自動的に管理できるため、これはオプションです。要求に関連して単一のセッションを確立するためのインフラストラクチャのような多くの利点があります。要求の最後に正しく分解され、解消されます。

  • 2番目の方法では、純粋なSQLAlchemyアプリケーションです。そのため、ライブラリを使用して特定のデータベースに接続する場合は、コマンドラインスクリプト、バックグラウンドデーモン、GUIなどのSQLAlchemy APIのみを使用できます。インタフェース駆動型アプリケーションなど

だから、あなたは次のように、追加することができる方法の両方で:フラスコ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 

は、私はちょうどあなたが多くの方法を使用して追加することができますショーのために同じデータベースに接続していことを実現します。

関連する問題