2017-05-03 4 views
1

私は初心者SQLAlchemyの使用だと私は複雑なETLプロセスに取り組んでいると、複数のモジュール間でscoped_sessionの取り扱いので、私でした以下の簡略化されたコード:SQLAlchemyの

module1.py

class Foo: 
    def foo_method(self): 
     # doing stuff with database 

module2.py

class Bar: 
    def bar_method(self): 
     # doing stuff with database 

main_script.py

from module1 import Foo 
from module2 import Bar 

def run(): 
    with Pool(processes = num_workers) as pool: 
     responses = [pool.apply_async(some_func, (param)) for param in params] 
     for response in responses: 
      response.get() 


def some_func(param): 
    engine = create_engine(connection_string, echo=True) 
    Session = scoped_session(sessionmaker(bind=engine)) 
    session = Session()  
    # Start doing some stuff with database 
    foo = Foo() 
    foo.foo_method() 

    bar = Bar() 
    bar.bar_method() 

私はワーカープロセスを持つプールを持っています。 main_script.run()と呼ぶと、各作業者はsome_funcのデータベースセッションを作成します。私の質問は、どのように、各メソッドにparamでセッションを渡すことなく、module1とmodule2の各ワーカーに同じセッションを使用できるのですか?各モジュール/ファイルに次の行を追加する必要がありますか?

engine = create_engine(connection_string, echo=True) 
    Session = scoped_session(sessionmaker(bind=engine)) 
    session = Session() 

答えて

1

scoped_sessionをモジュールレベルで作成する必要があります。

db.py

engine = create_engine(connection_string, echo=True) 
Session = scoped_session(sessionmaker(bind=engine)) 

module1.py

from db import Session 

class Foo: 
    def foo_method(self): 
     session = Session() 
     session.query(...)... 
+0

@univerioこんにちは、:おそらくエンジンとのセッションを収容するために別のモジュールを有することを意味するプロジェクトの構造については、あなたのansewerのおかげで。私はそれを試してみませんか?あなたは私に提案するより良いアプローチをしていますか?私はそれを本当に評価します –

+0

@ Overflow012あなたが何を求めているのか分かりません。これが標準的なアプローチです。これはあなたのために働かないのですか? – univerio