2016-12-11 44 views
6

aiohttp ve sqlalchemy kullanıyorum ve SQLAlchemy örneğine ihtiyaç duyduğumda bağlanmamı sağlayan bir Tekton oluşturdum (kod şöyle) . Maalesef her bir süre içinde (Ben sunucuyu yeniden başlatarak "çözmek") aşağıdaki hatayı alıyorum: Geçerli kodu düzeltmek için herhangi bir yoluaiohttp + sqlalchemy: Geçersiz işlem geri alınana kadar yeniden bağlanamıyor

Dec 11 09:35:29 ip-xxx-xxx-xxx-xxx gunicorn[16513]: sqlalchemy.exc.StatementError: (sqlalchemy.exc.InvalidRequestError) Can't reconnect until invalid transaction is rolled back [SQL: '... \nFROM ...\nWHERE ... = %(username_1)s \n LIMIT %(param_1)s'] [parameters: [{}]]```

var mı? Teşekkür :)

CONNECTION_DETAILS = { 
    'driver': 'pymysql', 
    'dialect': 'mysql', 
    'host': os.environ.get('HOST'), 
    'port': 3306, 
    'user': 'master', 
    'password': os.environ.get('PASSWORD'), 
    'database': 'ourdb', 
    'charset': 'utf8' 
} 

_instance = None 

def __new__(cls, *args, **kwargs): 
    if not cls._instance: 
     con_str = '{dialect}+{driver}://{user}:{password}@' \ 
        '{host}:{port}/{database}?charset={charset}'\ 
      .format(**cls.CONNECTION_DETAILS) 
     try: 
      engine = sqlalchemy.create_engine(con_str) 

      Session = scoped_session(sessionmaker(bind=engine)) 
      session = Session() # Create the ORM handle 
     except sqlalchemy.exc.OperationalError: 
      logger.exception('Establishing database connection error.') 

     cls._instance = super().__new__(cls) 
     logger.debug("Returning database's session.") 
     cls._instance.session = session 

     # Initializing tables 
     cls._instance.Users = Users 
     cls._instance.Services = Services 
     cls._instance.APIKeys = APIKeys 

    return cls._instance 
+0

Sorunuz hakkında hiçbir fikrim yok, ama neden aiohttp'i sqlalchemy ile kullanıyorsunuz? async çerçeveli bir async orm? – Juggernaut

+0

Bunun, aynı iş parçacığında çalışan birden çok aiohttp isteği nedeniyle olduğunu düşünüyorum, bu nedenle "Oturum", "scoped_session" ın "scopefunc" değeri nedeniyle birden çok görev arasında paylaşılır. [Bu soru] bölümüne bakın (http://stackoverflow.com/questions/34369164/correct-usage-of-sqlalchemy-scoped-session-with-python-asyncio). – univerio

cevap

1

Bu oldukça geç cevap olacaktır. Olan şey şu: Seansı kullanırken, bir sqlalchemy Error (her şey saf SQL olarak kullanılabilecek bir hatayı da atacak olan bir şey: sözdizimi hataları, benzersiz kısıtlamalar, anahtar çarpışmalar vb.) Ortaya çıkar.

Bu hatayı bulmanız, bir try/except-blokajına sarmanız ve session.rollback() gerçekleştirmeniz gerekir.

Bundan sonra oturumunuzu eski haline getirebilirsiniz.