一、简介
aiomysql
是一个基于 asyncio
的 MySQL 客户端库,它允许你在 Python 异步编程环境中与 MySQL 数据库进行交互。通过使用 aiomysql
,你可以在不阻塞主线程的情况下执行数据库操作,提高应用程序的响应性和吞吐量。
二、安装
你可以使用 pip
来安装 aiomysql
:
pip install aiomysql
三、连接到 MySQL 数据库
下面是一个连接到 MySQL 数据库的基本示例:
# database.py
import aiomysql
# 全局连接池变量
_pool = None
async def get_pool():
global _pool
if _pool is None or _pool.closed:
_pool = await aiomysql.create_pool(
host='localhost',
port=3306,
user='your_username',
password='your_password',
db='your_database',
autocommit=True
)
return _pool
async def close_pool():
global _pool
if _pool is not None and not _pool.closed:
_pool.close()
await _pool.wait_closed()
# 你可以添加更多的数据库操作函数,比如查询、插入等
四、基本操作
一般我们采用async with 语句来自动管理连接和游标。这意味着当你离开 with 块时,连接和游标会自动关闭。
1. 查询
下面是一个执行 SELECT 查询并打印结果的示例:
import async
from database import get_pool
async def execute_query(pool, sql,args=()):
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(sql,args)
rows = await cur.fetchall()
for row in rows:
print(row)
# 示例 SQL 查询
sql = "SELECT * FROM your_table"
# 运行异步函数
asyncio.run(execute_query(await get_pool(), sql))
2. 插入数据
import async
from database import get_pool
async def insert_data(pool, data):
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute("INSERT INTO your_table (column1, column2) VALUES (%s, %s)", data)
# 示例数据
data = ('value1', 'value2')
# 运行异步函数
asyncio.run(insert_data(await get_pool(), data))
3. 更新数据
import async
from database import get_pool
async def update_data(pool, where_clause, data):
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(f"UPDATE your_table SET column1=%s WHERE {where_clause}", data)
await conn.commit() # 提交更改
# 示例更新条件和数据
where_clause = "id = 1"
data = ('updated_value',)
# 运行异步函数
asyncio.run(update_data(await get_pool(), where_clause, data))
4. 删除数据
import async
from database import get_pool
async def delete_data(pool, where_clause):
async with pool.acquire() as conn:
async with conn.cursor() as cur:
await cur.execute(f"DELETE FROM your_table WHERE {where_clause}")
await conn.commit() # 提交更改
# 示例删除条件
where_clause = "id = 1"
# 运行异步函数
asyncio.run(delete_data(await get_pool(), where_clause))
五、关闭连接池
通常,连接池会在你的应用程序结束时自动关闭。但是,如果你需要在某个特定时间点关闭连接池,你可以调用连接池的 close()
方法。但是,请注意,如果你打算在应用程序的整个生命周期中重用连接池,那么通常不需要手动关闭它。
async def close_pool(pool):
pool.close()
await pool.wait_closed() # 等待所有池子中的连接都执行完了就关闭
# 运行异步函数关闭连接池(通常不需要这样做,除非你确定不再需要连接池)
# asyncio.run(close_pool(your_pool))
六、事务
在aiomysql
中,事务的回滚通常通过执行ROLLBACK
SQL语句来实现。当你在一个事务中执行了多个操作,并且希望撤销这些操作(例如,由于某个操作失败或你想撤销之前的更改),你可以使用ROLLBACK
语句。
以下是一个如何在aiomysql
中使用事务并进行回滚的示例:
import aiomysql
import asyncio
async def perform_transaction(pool, sql_list):
async with pool.acquire() as conn:
try:
async with conn.cursor() as cur:
# 开始一个事务
await conn.begin()
# 执行SQL语句列表
for sql in sql_list:
await cur.execute(sql)
# 如果没有错误,提交事务
await conn.commit()
except Exception as e:
# 如果发生异常,回滚事务
print(f"An error occurred: {e}")
await conn.rollback()
# 示例SQL语句列表
sql_list = [
"UPDATE your_table SET column1='value1' WHERE id=1",
"UPDATE your_table SET column2='value2' WHERE id=2", # 假设这行会失败,比如因为约束冲突
# ... 其他SQL语句
]
# 运行异步函数执行事务
asyncio.run(perform_transaction(await get_pool(), sql_list))
# 注意:这里假设get_pool()函数是从之前的database.py模块中获取的
在这个示例中,perform_transaction
函数接受一个连接池和一个SQL语句列表作为参数。它首先获取一个连接,并开始一个事务。然后,它遍历SQL语句列表并执行每个语句。如果在执行过程中发生异常,它会捕获该异常并回滚事务。如果没有异常,它会提交事务。
七. 注意
在实际应用中,你可能希望将连接池的创建和管理封装在一个单独的模块或类中,以便在整个应用程序中重用。这样,你就可以在需要时轻松地获取到数据库连接,而无需每次都重新创建连接池,可以参考本文开头一样创建一个创建连接池的文件。
原文始发于微信公众号(Python小白养成记):每日一模块:aiomysql
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/289633.html