Introduction
Avec la popularité croissante des frameworks web asynchrones comme FastAPI et Starlette, le besoin de méthodes rapides et non bloquantes pour interagir avec la base de données augmente. asyncpg est un client asynchrone pour PostgreSQL, conçu dès le départ pour des performances maximales.
asyncpg est un moyen bas niveau, rapide et efficace de travailler avec PostgreSQL dans un style async/await, ce qui en fait un excellent choix pour les applications Python modernes. La bibliothèque est écrite en Python et Cython, garantissant une vitesse d'exécution élevée et une surcharge minimale.
Qu'est-ce qu'asyncpg
asyncpg est un pilote PostgreSQL asynchrone complet pour Python, offrant une interaction directe avec la base de données sans utiliser d'ORM. La bibliothèque prend en charge toutes les fonctionnalités modernes de PostgreSQL, notamment JSON, UUID, les tableaux, les types de données personnalisés et les fonctions avancées.
Les principaux avantages d'asyncpg :
- Asynchronisme complet avec prise en charge d'asyncio
- Haute performance grâce à l'utilisation de Cython
- Prise en charge native de tous les types de données PostgreSQL
- Prise en charge intégrée du pool de connexions
- Sécurité contre les injections SQL
- Intégration simple avec les frameworks asynchrones
Installation et configuration initiale
Prérequis système
Pour utiliser asyncpg, vous avez besoin de :
- Python 3.7 ou supérieur
- PostgreSQL 9.5 ou supérieur
- Système d'exploitation : Linux, macOS, Windows
Installation de la bibliothèque
pip install asyncpg
Pour le développement, il est recommandé d'installer des paquets supplémentaires :
pip install asyncpg pytest-asyncio
Connexion de base à la base de données
import asyncpg
import asyncio
async def main():
# Connexion avec paramètres
conn = await asyncpg.connect(
user='postgres',
password='secret',
database='test_db',
host='127.0.0.1',
port=5432
)
# Vérification de la connexion
version = await conn.fetchval('SELECT version()')
print(f"Connecté à : {version}")
await conn.close()
asyncio.run(main())
Connexion via DSN
# Utilisation d'une chaîne de connexion
dsn = "postgresql://postgres:secret@127.0.0.1:5432/test_db"
conn = await asyncpg.connect(dsn)
Asynchronisme en Python et rôle d'asyncpg
asyncpg utilise async/await et est entièrement compatible avec asyncio, permettant d'exécuter des requêtes non bloquantes vers PostgreSQL. C'est crucial pour les applications et API à forte charge, où le blocage de la boucle d'événements peut entraîner une baisse significative des performances.
Différence avec les pilotes synchrones
Contrairement à psycopg2, qui est synchrone, asyncpg ne bloque pas l'exécution d'autres tâches :
# Approche synchrone (psycopg2)
import psycopg2
conn = psycopg2.connect(...) # Bloque le thread
cursor = conn.cursor()
cursor.execute("SELECT * FROM users") # Bloque le thread
# Approche asynchrone (asyncpg)
import asyncpg
conn = await asyncpg.connect(...) # Ne bloque pas la boucle d'événements
rows = await conn.fetch("SELECT * FROM users") # Ne bloque pas la boucle d'événements
Exécution concurrente des requêtes
async def concurrent_queries():
conn = await asyncpg.connect(...)
# Exécution de plusieurs requêtes en parallèle
tasks = [
conn.fetch("SELECT * FROM users"),
conn.fetch("SELECT * FROM orders"),
conn.fetch("SELECT * FROM products")
]
results = await asyncio.gather(*tasks)
return results