Tôi đang sử dụng aiohttp
và sqlalchemy
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
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
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