私はaiohttp
とsqlalchemy
を使用しています。SQLAlchemyのインスタンスが必要なときに接続するのに役立つシングルトンを作成しました。 。 は残念ながら、一度のしばらくの間中、私は(私は、サーバーを再起動して「解決」)は、次のエラーが表示されます。aiohttp + sqlalchemy:無効なトランザクションがロールバックされるまで再接続できない
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: [{}]]```
は、現在のコードを修正する方法はありますか? ありがとう:)
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
質問には手がかりがありませんが、なぜaiohttpをsqlalchemyで使用していますか?非同期フレームワークを持つ非同期orm? – Juggernaut
これは、同じスレッドで複数のaiohttp要求が実行されていることが原因であると考えます。したがって、 'Session'は' scoped_session'の 'scopefunc'のために複数のタスク間で共有されます。 [この質問](http://stackoverflow.com/questions/34369164/correct-usage-of-sqlalchemy-scoped-session-with-python-asyncio)を参照してください。 – univerio