2017-05-03 2 views
1

Ich bin Neuling mit SQLAlchemy und ich arbeite auf einem komplexen ETL-Prozess, so habe ich die folgenden vereinfachten Code:Handhabung scoped_session über mehrere Module mit 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() 

So habe ich einen Pool mit Worker-Prozess. Wenn ich main_script.run() aufrufen, erstellt jeder Worker eine Datenbanksitzung in some_func. Meine Frage ist, wie kann ich die gleiche Sitzung für jeden Arbeiter in Modul1 und Modul2 verwenden, ohne die Sitzung durch param zu jeder Methode zu übergeben? Sollte ich die folgenden Zeilen in jedem Modul/Datei hinzufügen?

Antwort

1

scoped_session sollte auf der Modulebene erstellt werden. Für Ihre Projektstruktur, die wahrscheinlich bedeutet, ein eigenes Modul mit dem Motor und Sitzung Hause:

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

Hallo @univerio, Danke für deine Antwort. Ich werde es versuchen, aber hast du einen besseren Ansatz, um mich vorzuschlagen? Ich werde es wirklich schätzen –

+0

@ Overflow012 Nicht sicher, was Sie fragen. Dies ist der Standardansatz. Funktioniert das nicht für dich? – univerio

Verwandte Themen