簡體   English   中英

停止sqlalchemy管理連接

[英]Stop sqlalchemy from managing the connection

我正在嘗試使用現有的數據庫連接來初始化SQLAlchemy,但我希望它完全停止管理它(打開,關閉,回滾等)。 這是因為我將它與不同的ORM(django)一起使用,而SQLAlchemy實際上只是一種執行更復雜查詢的方法。 它將僅用於讀取,我只是想讓它連接,使用它並保持原樣。

到目前為止我嘗試了什么:

from sqlalchemy.pool import NullPool
from sqlalchemy import create_engine
from django.db import connection

class DummyNullPool(NullPool):
    def _do_return_conn(self, conn):
        # avoid closing the connection as it belongs to django
        # orm, sql alchemy is only a tool to read

        pass

def get_engine(dummy=True):
    kwargs = {}
    if dummy:
        kwargs['poolclass'] = DummyNullPool
        kwargs['creator'] = lambda: connection.connection

    return create_engine(conn_string, **kwargs)

這幾乎可以工作,但是(並非總是)掛在

 def _create_connection(self):
     return _ConnectionRecord(self, False)

所以我想必定會出現某種競爭條件。

我想重用相同連接的原因是因為我希望它能夠訪問當前事務中創建的記錄。

好的,我想我找到了一種“可行”的方法:

from django.conf import settings
from django.db import connection
from sqlalchemy.pool import NullPool
from sqlalchemy import create_engine as sa_create_engine

def do_nothing(dbapi_connection):
    return

def create_engine(db_name='default'):
    db = settings.DATABASES[db_name]

    conn_string = 'postgresql://{}{}@{}:{}/{}'.format(
        db['USER'],
        ':' + db['PASSWORD'] if db['PASSWORD'] else '',
        db['HOST'],
        db['PORT'],
        db['NAME']
    )

    engine = sa_create_engine(
        conn_string,
        poolclass=NullPool,
        creator=lambda: connection.connection
    )
    engine.dialect.do_close = do_nothing
    engine.dialect.do_commit = do_nothing
    engine.dialect.do_rollback = do_nothing
    return engine

請注意,它還沒有經過全面測試,它的實驗代碼更多。 假定connection.connection已初始化並處於打開狀態。 任何評論都非常感謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM