مقدمة
مع تزايد شعبية أطر الويب غير المتزامنة مثل FastAPI وStarlette، تزداد الحاجة إلى طرق سريعة وغير محظورة للتفاعل مع قاعدة البيانات. asyncpg هو عميل غير متزامن لـ PostgreSQL، تم تطويره من الصفر لتحقيق أقصى أداء.
يمثل asyncpg طريقة منخفضة المستوى وسريعة وفعالة للعمل مع PostgreSQL بأسلوب async/await، مما يجعله خيارًا ممتازًا لتطبيقات Python الحديثة. المكتبة مكتوبة بلغة Python وCython، مما يضمن سرعة عالية في تنفيذ العمليات وتقليل النفقات العامة.
ما هو asyncpg
asyncpg هو مشغل PostgreSQL غير متزامن كامل المواصفات للغة Python، يوفر تفاعلاً مباشرًا مع قاعدة البيانات دون استخدام 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، حيث يمكن أن يؤدي حظر event loop إلى انخفاض كبير في الأداء.
الفرق عن المشغلات المتزامنة
على عكس psycopg2، وهو متزامن، لا يقوم asyncpg بحظر تنفيذ المهام الأخرى:
# النهج المتزامن (psycopg2)
import psycopg2
conn = psycopg2.connect(...) # يحظر الخيط
cursor = conn.cursor()
cursor.execute("SELECT * FROM users") # يحظر الخيط
# النهج غير المتزامن (asyncpg)
import asyncpg
conn = await asyncpg.connect(...) # لا يحظر event loop
rows = await conn.fetch("SELECT * FROM users") # لا يحظر event loop
التنفيذ المتزامن للاستعلامات
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