asyncpg – عميل PostgreSQL غير متزامن

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة

مع تزايد شعبية أطر الويب غير المتزامنة مثل 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

الطرق والوظائف الرئيسية في asyncpg

جدول الطرق الرئي

توصيات