SQLAlchemy recommends using one engine per process because the underlying 
DBAPI connections are not necessarily safe to use across processes.

I have global engine and session variables that gets lazily populated with 
a SQLAlchemy engine and a session factory, respectively. This makes it easy 
to write database helpers that depend can call get_session() at runtime to 
use the session variable after it has been assigned a value by init_db.

That works well for letting helpers that need access to engine or session be 
imported before engine or session are initialized. But this pattern locks 
me into using one engine and sessionglobally.

However, what I really need to do is:

engine, session = init_db(DB_URL)

... from the calling application/method, and then inject the session into 
these database helpers. Why? Well, I need to use one engine per process. I 
think I need an inversion of control pattern here, but am having trouble 
coming up with something workable (that doesn't involve passing the session 
around to the helpers on each call, which is hacky and a last resort).

I thought I could just set up the engine after os.fork(). Each process 
would start with engine=None, then instantiate it. But engine has the same 
memory address in both the parent and child process. This makes sense; it's 
how Python works.

from utils import init_db, engine, DB_URLimport os
def connect():
    print('before fork, engine is: {}'.format(id(engine)))
    newpid = os.fork()

    if newpid == 0:
        init_db(DB_URL)
        print('child engine is: {}'.format(id(engine))) # id(engine) is equal 
to below call
    else:
        init_db(DB_URL)
        print('parent engine is: {}'.format(id(engine))) # id(engine) is equal 
to above call
if __name__ == '__main__':
    connect()

Is my best option to create a pool of sorts based on the process ID? I'd 
like to use a clean inversion of control pattern if possible.

NullPool doesn't pool connections and would make this work, but I don't 
think that's a good thing - it seems expensive to constantly open and close 
connections?

Python version: 3.4.0

SQLAlchemy version: 0.9.7

(I deleted a previous post with the same title because the code example was 
improperly indented.)

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to