asyncpg – Python异步PostgreSQL客户端库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

简介

随着FastAPI和Starlette等异步Web框架的流行,对快速、非阻塞数据库交互方式的需求日益增长。asyncpg是一个专为极致性能而从头构建的PostgreSQL异步客户端。

asyncpg提供了一种底层、快速且高效的async/await风格方式来操作PostgreSQL,是现代Python应用的绝佳选择。该库使用Python和Cython编写,确保了高执行速度和极低的开销。

什么是asyncpg

asyncpg是一个功能完备的Python异步PostgreSQL驱动,无需ORM即可直接与数据库交互。该库支持PostgreSQL所有现代特性,包括JSON、UUID、数组、自定义数据类型和高级功能。

asyncpg的主要优势:

  • 完全异步,支持asyncio
  • 借助Cython实现高性能
  • 原生支持所有PostgreSQL数据类型
  • 内置连接池支持
  • 防止SQL注入攻击
  • 易于与异步框架集成

安装与初始配置

系统要求

使用asyncpg需要:

  • Python 3.7或更高版本
  • PostgreSQL 9.5或更高版本
  • 操作系统:Linux、macOS、Windows

安装库

pip install asyncpg

建议为开发安装额外包:

pip install asyncpg pytest-asyncio

基本数据库连接

import asyncpg
import asyncio

async def main():
    # 使用参数连接
    conn = await asyncpg.connect(
        user='postgres',
        password='secret',
        database='test_db',
        host='127.0.0.1',
        port=5432
    )
    
    # 验证连接
    version = await conn.fetchval('SELECT version()')
    print(f"已连接到: {version}")
    
    await conn.close()

asyncio.run(main())

通过DSN连接

# 使用连接字符串
dsn = "postgresql://postgres:secret@127.0.0.1:5432/test_db"
conn = await asyncpg.connect(dsn)

Python异步编程与asyncpg的作用

asyncpg使用async/await语法,完全兼容asyncio,可执行非阻塞的PostgreSQL查询。这对高负载应用和API至关重要,因为阻塞事件循环会显著降低性能。

与同步驱动的区别

与同步的psycopg2不同,asyncpg不会阻塞其他任务的执行:

# 同步方式 (psycopg2)
import psycopg2
conn = psycopg2.connect(...)  # 阻塞线程
cursor = conn.cursor()
cursor.execute("SELECT * FROM users")  # 阻塞线程

# 异步方式 (asyncpg)
import asyncpg
conn = await asyncpg.connect(...)  # 不阻塞事件循环
rows = await conn.fetch("SELECT * FROM users")  # 不阻塞事件循环

并发执行查询

async def concurrent_queries():
    conn = await asyncpg.connect(...)
    
    # 并行执行多个查询
    tasks = [
        conn.fetch("SELECT * FROM users"),
        conn.fetch("SELECT * FROM orders"),
        conn.fetch("SELECT * FROM products")
    ]
    
    results = await asyncio.gather(*tasks)
    return results

asyncpg的主要方法与函数

主要方法表

推荐