为了账号安全,请及时绑定邮箱和手机立即绑定

停止 sqlalchemy 管理连接

停止 sqlalchemy 管理连接

三国纷争 2021-12-09 15:41:21
我正在尝试使用现有的数据库连接初始化 SQLAlchemy,但我希望它完全停止管理它(打开、关闭、回滚等)。这是因为我将它与不同的 ORM (django) 一起使用,而 SQLAlchemy 实际上只是一种执行更复杂查询的方法。它仅用于读取,我只希望它进行连接,使用它并保持原样。到目前为止我尝试过的:from sqlalchemy.pool import NullPoolfrom sqlalchemy import create_enginefrom django.db import connectionclass 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        passdef 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)所以我想一定有某种竞争条件。我之所以要重用相同的连接,是因为我希望它能够访问在当前事务中创建的记录。
查看完整描述

1 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

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


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


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 354 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号