需要注意的是 aiomysql 是基于协程的,因此需要通过 await 的方式来调用。
使用 aiomysql 连接到数据库可以使用 aiomysql.connect() 方法。它会返回一个 connection 对象, connection 对象代表了一个数据库连接:
import aiomysql
async def run(loop):
conn = await aiomysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='password',
db='test',
loop=loop)
# 执行数据库操作 ...
conn.close()
loop = asyncio.get_event_loop()
loop.run_until_complete(run(loop))
连接成功后,可以通过 connect 对象得到一个 cursor 对象,你可以通过 cursor 对象来调用数据库指令,从而完成增删改查等操作
cursor = await conn.cursor()
await cursor.execute("INSERT INTO user set email='hahaha123@outlook.com', phonenumber='12345678910'")
print(cursor.rowcount)
# 必须调用 commit, 操作才会真正在数据库中执行。
await conn.commit()
conn.close()
aiomysql.connect() 的参数中有一个 autocommit 参数,默认为 False, 你可以把它设置为 True, 这样就不需要手动调用 connection.commit() 了。
连接池
除了使用之前介绍过的 aiomysql.connect() 方法来连接到数据库,aiomysql 还提供了连接池的接口,有了连接池的话,不必频繁打开和关闭数据库连接。
import aiomysql
import asyncio
g_pool = None
async def fetch_user():
global g_pool
# 从连接池中获取连接
with (await g_pool) as conn:
# 用这个连接执行数据库操作
cursor = await conn.cursor()
await cursor.execute("SELECT * FROM user")
rows = await cursor.fetchall()
print(rows)
# with 退出后,将自动释放 conn 到 g_pool 中
async def fetch_blog():
global g_pool
with (await g_pool) as conn:
cursor = await conn.cursor()
await cursor.execute("SELECT * FROM blog")
rows = await cursor.fetchall()
print(rows)
async def run(loop):
global g_pool
g_pool = await aiomysql.create_pool(
host='127.0.0.1',
port=3306,
user='root',
password='password',
db='test',
autocommit=True,
minsize=1,
maxsize=10,
loop=loop)
await fetch_user()
await fetch_blog()
g_pool.close()
await g_pool.wait_closed()
loop = asyncio.get_event_loop()
loop.run_until_complete(run(loop))
进入 fetch_user() 或 fetch_blog() 协程后,首先要做的是通过 with (await g_pool) as conn 来从连接池中取出一个连接,因为池中的可能已经被用完,
这时候需要等待,所以这里需要通过 await g_pool 的方式来调用。