首页 > 解决方案 > 停止 sqlalchemy 管理连接

问题描述

我正在尝试使用现有的数据库连接初始化 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)

所以我想一定有某种竞争条件。

我想重用相同连接的原因是因为我希望它能够访问在当前事务中创建的记录。

标签: pythonsqlalchemy

解决方案


好的,我想我找到了一种“有效”的方法:

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已初始化并且已打开。非常感谢任何评论。


推荐阅读