sqlalchemy engine.connect()停滞不前

时间:2017-10-06 09:06:28

标签: python mysql sqlalchemy

我使用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. 如果我不能,还有其他方法可以达到这个目的吗? (例如,我将使用默认端口建立测试订单,但我希望能在几秒钟后终止连接()。

  3. 编辑:

    此代码位于Django中,因此我无法使用信号/闹钟,因为多线程。

1 个答案:

答案 0 :(得分:1)

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

  

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