リクエストが終了した後でもクエリされたテーブルがまだロックされていて、イベントループを停止するまで "切り捨て"を実行できないことがコンテキストマネージャの「with」内部でSQL文を実行することに気付きました。ここでコンテキストマネージャを使用している場合でもaiomysqlがテーブルをロックするのはなぜですか?
は、私のコードの例です:
import logging
import asyncio
import aiomysql
from aiohttp import web
from aiomysql.cursors import DictCursor
logging.basicConfig(level=logging.DEBUG)
async def index(request):
async with request.app["mysql"].acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("SELECT * FROM my_table")
lines = await cur.fetchall()
return web.Response(text='Hello Aiohttp!')
async def get_mysql_pool(loop):
pool = await aiomysql.create_pool(
host="localhost",
user="test",
password="test",
db="test",
cursorclass=DictCursor,
loop=loop
)
return pool
if __name__ == "__main__":
loop = asyncio.get_event_loop()
mysql = loop.run_until_complete(get_mysql_pool(loop))
app = web.Application(loop=loop, debug=True)
app["mysql"] = mysql
app.router.add_get("/", index)
web.run_app(app)
カール「http://localhost:8080/」を実行した後、私はMySQLのCLIを使用してMySQLサーバに接続して実行「my_tableに切り捨てる」しようとしている - それがされるまで終了しません私はaiohttpを止める。この動作を変更するには?
は、私があまりにもSELECTステートメントをコミットする必要があることを知りませんでした。 – offline15