2016-12-11 31 views
6

Tôi đang sử dụng aiohttpsqlalchemy và tôi đã tạo Singleton giúp tôi kết nối khi cần một phiên bản SQLAlchemy (mã sau) . Thật không may, mỗi một lần trong một thời gian tôi nhận được lỗi sau (mà tôi "giải quyết" bằng cách khởi động máy chủ):a2http + sqlalchemy: Không thể kết nối lại cho đến khi giao dịch không hợp lệ được khôi phục

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: [{}]]```

Có cách nào để sửa chữa các mã hiện tại? Cảm ơn :)

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

Tôi không biết gì về câu hỏi của bạn, nhưng tại sao bạn sử dụng aiohttp với sqlalchemy? một orm không đồng bộ với một khung công tác không đồng bộ? – Juggernaut

+0

Tôi tưởng tượng điều này là do nhiều yêu cầu aiohttp đang chạy trong cùng một luồng, do đó, 'Session' được chia sẻ giữa nhiều tác vụ do' scopefunc' của 'scoped_session'. Xem [câu hỏi này] (http://stackoverflow.com/questions/34369164/correct-usage-of-sqlalchemy-scoped-session-with-python-asyncio). – univerio

Trả lời

1

Đây sẽ là câu trả lời khá muộn. Đây là những gì xảy ra: Trong khi sử dụng phiên, một lỗi sqlalchemy được nêu ra (bất cứ điều gì cũng sẽ ném một lỗi khi được sử dụng như là các lỗi cú pháp SQL: các lỗi cú pháp, các ràng buộc duy nhất, các va chạm chính, vv).

Bạn sẽ phải tìm lỗi này, đưa mã này vào khóa try/except và thực hiện session.rollback().

Sau này, bạn có thể khôi phục phiên của mình.

Các vấn đề liên quan