在asyncpg中,如果使用with语句创建池连接,则该连接在with语句结束时自动释放,并自动提交或回滚事务(取决于with语句块中的操作是否成功)。如果在with语句块中发生错误,则连接将回滚所有已执行的操作。下面是使用with语句进行数据库事务的示例代码:
import asyncio
import asyncpg
async def main():
# 创建池连接
pool = await asyncpg.create_pool(database='my_db', user='my_user', password='my_password')
# with语句块中执行数据库操作
async with pool.acquire() as connection:
async with connection.transaction():
await connection.execute('''CREATE TABLE users (
id serial PRIMARY KEY,
name varchar(100) NOT NULL,
age int
);''')
await connection.execute('''INSERT INTO users (name, age) VALUES ($1, $2)''', 'Alice', 25)
await connection.execute('''INSERT INTO users (name, age) VALUES ($1, $2)''', 'Bob', 'not a number')
asyncio.run(main())
在上面的示例代码中,如果第二个INSERT语句出现错误,所有已执行的操作都将回滚,包括第一个INSERT语句和CREATE TABLE语句。