gpt4 book ai didi

python - sqlalchemy engine.connect() 停止

转载 作者:行者123 更新时间:2023-11-28 23:08:14 26 4
gpt4 key购买 nike

我使用 sqlachemy 连接到远程数据库,但我不知道类型(可以是 PostgreSQL、MariaDB 等)。我循环尝试它们并保留第一个工作驱动程序:

for driver in drivers:
try:
uri = get_uri_from_driver(driver)
engine = create_engine(uri, echo=False)
print('Try connection')
con = engine.engine.connect()
# Try to get some lines
return engine
except Exception:
continue
return None

在某些情况下,con = engine.engine.connect() 不会结束,当您尝试 MySQL 驱动程序连接到不是 MySQL (Oracle) 的东西时,它就会发生。

问题:

  1. 如何为此设置超时?

  2. 如果我做不到,还有其他方法可以实现吗? (例如,我将使用默认端口作为测试顺序的基础,但我希望能够在几秒钟后终止 connect()。

编辑:

此代码在 Django 中,因此由于多线程,我无法使用信号/警报。

最佳答案

这可以通过通用超时解决方案来完成,例如:

What should I do if socket.setdefaulttimeout() is not working?

import signal

class Timeout():
"""Timeout class using ALARM signal"""
class TimeoutException(Exception): pass

def __init__(self, sec):
self.sec = sec

def __enter__(self):
signal.signal(signal.SIGALRM, self.raise_timeout)
signal.alarm(self.sec)

def __exit__(self, *args):
signal.alarm(0) # disable alarm

def raise_timeout(self, *args):
raise Timeout.TimeoutException()


# In your example
try:
uri = get_uri_from_driver(driver)
engine = create_engine(uri, echo=False)
print('Try connection')
with Timeout(10):
con = engine.engine.connect()
# Try to get some lines
return engine
except Exception:
continue

关于python - sqlalchemy engine.connect() 停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46602190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com