عن المشروع

lib/pq هو تطبيق مكتوب بلغة Go النقية لبرنامج تشغيل PostgreSQL يتكامل مع حزمة database/sql القياسية في Go. وهو يدعم جميع إصدارات PostgreSQL التي لا تزال قيد الصيانة حاليًا، ويوفّر صيغة DSN مألوفة ومتوافقة مع libpq، بحيث يقبل سلاسل الاتصال بنمط key=value وكذلك بنمط عناوين URL مثل postgres://. من أبرز المزايا: - **المصادقة**: يدعم PASSWORD وMD5 وSCRAM-SHA256 جاهزًا للاستخدام مباشرة. كما تتوفر مصادقة GSS/Kerberos الاختيارية عبر وحدة منفصلة باسم auth/kerberos لتجنّب التبعيات غير الضرورية. ويتضمن أيضًا دعم ملفات pgpass. - **الاستيراد الجماعي**: يتم دعم التعليمة COPY [..] FROM STDIN لتحميل كميات كبيرة من البيانات بكفاءة ضمن المعاملات. - **LISTEN/NOTIFY**: يوفّر النوع pq.Listener إشعارات PostgreSQL عبر قناة Go، ما يمكّن من أنماط عمل فورية قائمة على الأحداث. - **معالجة الأخطاء**: تُعاد أخطاء PostgreSQL على شكل pq.Error مع حقول منظّمة. ويساعد التابع pq.As في تحويل الأخطاء إلى قيم من النوع pq.Error، بينما تضيف الدالة ErrorWithDetail() معلومات DETAIL وCONTEXT لأغراض التنقيح. - **معالجة رسائل NOTICE**: يمكن التقاط رسائل NOTICE الإعلامية الصادرة من PostgreSQL عبر معالج استدعاء قابل للتهيئة. - **معاملات وقت التشغيل**: على عكس libpq، يتيح pq ضبط معاملات وقت التشغيل مثل search_path وwork_mem مباشرة في سلسلة الاتصال. - **البنية Config**: توفّر البنية pq.Config تهيئة الاتصال برمجيًا، مع قيام pq.NewConfig بتحليل سلاسل DSN وpq.NewConnectorConfig بإنشاء موصل اتصال. ومن القيود الموثقة في ملف README أن LastInsertId غير مدعوم، ويجب استخدام INSERT ... RETURNING بدلًا منه، وأن معالجة الطوابع الزمنية تستخدم المنطقة الزمنية للخادم مع timestamptz ومنطقة ثابتة بإزاحة صفرية مع timestamp بدون منطقة زمنية، وأن ترميز bytea أثناء COPY قد يسبب مشكلات مع أعمدة jsonb. ويتضمن المشروع مجموعة اختبارات شاملة يمكن تشغيلها عبر Docker Compose مقابل عدة إصدارات من PostgreSQL وpgbouncer وpgpool. كما يتيح متغير البيئة PQGO_DEBUG=1 إخراج تصحيح على مستوى البروتوكول لاستكشاف الأخطاء وإصلاحها.