python - 停止 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)
所以我想一定有某种竞争条件。
我想重用相同连接的原因是因为我希望它能够访问在当前事务中创建的记录。
解决方案
好的,我想我找到了一种“有效”的方法:
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
已初始化并且已打开。非常感谢任何评论。
推荐阅读
- tizen - 检测何时将应用程序放入最近
- python - 存在于不同 txt 文件中的每个用户的总缺席和加入时间
- javascript - 未定义vue js中对象的属性,但该属性存在于对象中
- html - 如何使创建的帖子连续四个并在下一行继续?
- html - 如何在vba selenium中找到html标签的最后一个孩子
- laravel - 带有两个提交按钮和资源控制器的 Laravel 表单
- python - 如何仅从 Google Cloud Datastore 实体中提取密钥
- python - 在二维数组中添加值,前提是第一个值大于 5
- json - 在我切换到其他小部件组后,将 JSON 数据更改为 null 的变量
- visual-studio-code - 我正在设置 ProxyCommand,关于端口的信息在哪里?