2017-10-06 8 views
1

J'utilise sqlachemy pour me connecter à une base de données distante mais je ne connais pas le type (peut être PostgreSQL, MariaDB, etc.). Je les essaie dans une boucle et je garde le premier pilote de travail:sqlalchemy engine.connect() bloqué

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 

Dans certains cas, la con = engine.engine.connect() ne finit pas et il se produit lorsque vous essayez le pilote MySQL pour se connecter à quelque chose qui n'est pas MySQL (Oracle).

Questions:

  1. Comment puis-je définir un délai à cela?

  2. Si je ne peux pas, y a-t-il un autre moyen d'y parvenir? (Je par exemple la base l'ordre de test avec le port par défaut, mais je voudrais être en mesure de tuer le connect() après quelques secondes

EDIT:.

Ce code est dans un Django si Je ne peux pas utiliser le signal/alarme en raison de multi-threading

Répondre

1

Cela peut être fait avec une solution de délai d'attente générique comme dans:.

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 
+0

Ne fonctionne pas avec Django (multi-thread): ValueError: le signal ne fonctionne que dans le thread principal. J'ajoute ceci à la question – Benjamin