PG هي واجهة Ruby إلى PostgreSQL RDBMS. إنه يعمل مع PostgreSQL 10 وما بعده.
استخدام مثال صغير:
#!/usr/bin/env ruby
require 'pg'
# Output a table of current connections to the DB
conn = PG . connect ( dbname : 'sales' )
conn . exec ( "SELECT * FROM pg_stat_activity" ) do | result |
puts " PID | User | Query"
result . each do | row |
puts " %7d | %-16s | %s " %
row . values_at ( 'pid' , 'usename' , 'query' )
end
end 

عادة ما يعمل مع إصدارات سابقة من Ruby/PostgreSQL أيضًا ، ولكن لا يتم اختبارها بانتظام.
نقوم بصياغة GEMS ونطلقها وفقًا لمبدأ الإصدار الدلالي.
نتيجة لهذه السياسة ، يمكنك (وينبغي) تحديد الاعتماد على هذه الأحجار الكريمة باستخدام قيد الإصدار المتشائم مع رقمين من الدقة.
على سبيل المثال:
spec . add_dependency 'pg' , '~> 1.0' التثبيت عبر Rubygems:
gem install pg
قد تحتاج إلى تحديد مسار برنامج "PG_CONFIG" المثبت مع Postgres:
gem install pg -- --with-pg-config=<path to pg_config>
إذا كنت تقوم بالتثبيت عبر Bundler ، فيمكنك تقديم تلميحات ترجمة مثل SO:
bundle config build.pg --with-pg-config=<path to pg_config>
راجع README-OS_X.RDOC لمزيد من المعلومات حول التثبيت تحت MACOS X ، و README-Windows.rdoc لتعليمات Windows Build/التثبيت.
هناك أيضًا مجموعة Google+ وقائمة بريدية إذا تعثرت ، أو تريد فقط الدردشة حول شيء ما.
إذا كنت ترغب في التثبيت كجوهرة موقعة ، فيمكن العثور على شهادات عامة من GEM Signers في دليل certs للمستودع.
يمكن لـ PG كتابة قيم النتائج المصبوب اختياريًا ومعلمات الاستعلام في رمز Ruby أو N الأصلي. يمكن أن يؤدي ذلك إلى تسريع عمليات نقل البيانات من وإلى قاعدة البيانات ، لأنه يتم تقليل تخصيصات السلسلة ويمكن حذف التحويلات في رمز الياقوت (أبطأ).
يمكن تمكين صب النوع الأساسي للغاية بواسطة:
conn . type_map_for_results = PG :: BasicTypeMapForResults . new conn
# ... this works for result value mapping:
conn . exec ( "select 1, now(), '{2,3}'::int[]" ) . values
# => [[1, 2014-09-21 20:51:56 +0200, [2, 3]]]
conn . type_map_for_queries = PG :: BasicTypeMapForQueries . new conn
# ... and this for param value mapping:
conn . exec_params ( "SELECT $1::text, $2::text, $3::text" , [ 1 , 1.23 , [ 2 , 3 ] ] ) . values
# => [["1", "1.2300000000000000E+00", "{2,3}"]]لكن نوع PG من النوع القابل للتخصيص للغاية. لهذا السبب ينقسم إلى طبقتين:
هذه هي الطبقة السفلية ، التي تحتوي على فئات ترميز تحوّل كائنات Ruby لإرسالها إلى DBMs وفئات فك التشفير لتحويل البيانات المستلمة إلى كائنات Ruby. يتم الحصول على أسماء الفصول وفقًا لتنسيقها واتجاهها في pg :: textencoder ، pg :: textDecoder ، pg :: binaryencoder و pg :: binarydecoder.
من الممكن تعيين نوع OID أو تنسيق رمز (نص أو ثنائي) واختياري اسم إلى كائن تشفير أو فك ترميز. من الممكن أيضًا إنشاء أنواع مركبة عن طريق تعيين ترميز/فك ترميز عنصر. يمكن استخدام كائنات pg :: المبرمج لإعداد pg :: typemap أو بدلاً من ذلك لتحويل القيم المفردة إلى/من تمثيل السلسلة.
يتم دعم أنواع أعمدة postgresql التالية بواسطة Ruby-PG (TE = Text Encoder ، td = decoder text ، Be = Binary Encoder ، bd = decoder binary):
يمكن أيضًا تشفير النص التالي والتنسيقات الثنائية على الرغم من عدم استخدامه كنوع العمود:
تحدد TypeMap القيمة التي سيتم تحويلها بواسطة تشفير/وحدة فك ترميز. هناك استراتيجيات خريطة من النوع المختلفة ، التي تنفذها عدة مشتقات من هذه الفئة. يمكن اختيارها وتكوينها وفقًا للاحتياجات الخاصة لالتقاط النوع. خريطة النوع الافتراضي هي pg :: typemapallstrings.
يمكن تعيين خريطة الكتابة لكل اتصال أو لكل استعلام على التوالي لكل مجموعة نتيجة. يمكن أيضًا استخدام خرائط الكتابة للنسخ داخل وخارج دفق البيانات. انظر PG :: Connection#copy_data.
تتوفر خرائط النوع الأساسي التالي:
خرائط النوع التالية مملوءة مع تعيينات النوع من PG :: BasicTyperegistry:
PG هو مؤشر ترابط آمن بطريقة يمكن أن تستخدم مؤشرات الترابط المختلفة كائنات اتصال PG :: بشكل متزامن. ومع ذلك ، ليس من الآمن الوصول إلى أي كائنات PG في وقت واحد من أكثر من مؤشر ترابط واحد. لذا تأكد من فتح اتصال خادم قاعدة بيانات جديد لكل مؤشر ترابط جديد أو استخدام مكتبة Wrapper مثل ActivereCord التي تدير الاتصالات بطريقة آمنة مؤشر ترابط.
إذا تم طباعة رسائل مثل ما يلي إلى Stderr ، فمن المحتمل أنك تستخدم اتصال واحد من عدة مؤشرات ترابط:
message type 0x31 arrived from server while idle
message type 0x32 arrived from server while idle
message type 0x54 arrived from server while idle
message type 0x43 arrived from server while idle
message type 0x5a arrived from server while idle
PG متوافق تمامًا مع Fiber.scheduler . على دعم Windows لـ Fiber.scheduler متاح على Ruby-3.1 أو الأحدث. يتم توجيه جميع عمليات حظر IO من خلال Fiber.scheduler . هذا هو السبب في أن PG يستخدم داخليًا واجهة LIBPQ غير المتزامنة حتى لمكالمات طريقة المتزامنة/الحظر. كما أنه يستخدم دقة DNS الخاصة بـ Ruby بدلاً من وظائف LibpQ المدمجة.
يستخدم PG داخليًا دائمًا وضع الاتصال غير المحظور لـ LIBPQ. ثم يتصرف مثل الركض في وضع الحظر ولكنه يضمن ، أن يتم التعامل مع كل حظر IO في Ruby من خلال Fiber.scheduler المسجلة. عندما تسمى PG::Connection.setnonblocking(true) ، فإن حالة عدم الحظر ممكّنة ، ولكن يتم تعطيل المعالجة الإضافية لحالات الحظر ، بحيث يتعين على برنامج الاتصال التعامل مع حالات الحظر من تلقاء نفسها.
استثناء من هذه القاعدة هي طرق الكائنات الكبيرة مثل PG::Connection#lo_create وأساليب المصادقة باستخدام المكتبات الخارجية (مثل مصادقة GSSAPI). فهي غير متوافقة مع Fiber.scheduler . هذا يعني أن العملية ستعمل بشكل صحيح ، ولكن لا يمكن استخدام حالات انتظار IO للتبديل إلى ألياف أخرى تقوم بـ IO.
PG متوافق تمامًا مع MACRACT تم تقديمه في Ruby-3.0 منذ PG-1.5.0. يتم مشاركة جميع الأنواع EN/Decoders وخرائط النوع بين الحلقات إذا تم تجميدها بواسطة Ractor.make_shareable . كما يمكن مشاركة كائنات PG :: Frozen PG :: PG ::. لا يزال من الممكن استخدام جميع الكائنات المجمدة (باستثناء اتصال PG ::) للقيام بالتواصل مع خادم PostgreSQL أو لقراءة البيانات التي تم استردادها.
PG :: اتصال غير قابل للمشاركة ويجب إنشاؤه داخل كل فصل لإنشاء اتصال مخصص.
للإبلاغ عن الأخطاء ، أو اقتراح الميزات ، أو تحقق من المصدر بـ GIT ، تحقق من صفحة المشروع.
بعد التحقق من المصدر ، قم بتثبيت جميع التبعيات:
$ bundle install
ملفات تمديد التنظيف وملفات التغليف واختبار قواعد البيانات. قم بتشغيل هذا للتغيير بين إصدارات PostgreSQL:
$ rake clean
تمديد ترجمة:
$ rake compile
قم بتشغيل الاختبارات/المواصفات على إصدار postgresql الذي يشير pg_config --bindir إلى:
$ rake test
أو قم بتشغيل اختبار محدد لكل ملف ورقم سطر على إصدار postgresql محدد:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
توليد وثائق API:
$ rake docs
تأكد من التحقق من جميع الأخطاء والميزات الجديدة عن طريق الاختبارات.
المشروعون الحاليون هم مايكل جرانجر [email protected] ولارس Kanis [email protected].
حقوق الطبع والنشر (C) 1997-2022 من قبل المؤلفين.
يمكنك إعادة توزيع هذا البرنامج بموجب نفس الشروط مثل Ruby نفسها ؛ راجع https://www.ruby-lang.org/en/about/license.txt أو ملف BSDL في المصدر للحصول على التفاصيل.
أجزاء من الكود من مشروع PostgreSQL ، ويتم توزيعها بموجب شروط ترخيص postgresql ، المدرجة في ملف Postgres.
أجزاء حقوق الطبع والنشر Laika ، Inc.
انظر المساهمين. rdoc للعديد من الأشخاص الذين ساهموا في هذه المكتبة على مر السنين.
نحن ممتنون للأشخاص في قوائم Ruby-List و Ruby-Dev. وإلى الأشخاص الذين طوروا postgresql.