PG เป็นอินเทอร์เฟซทับทิมกับ 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 เวอร์ชันก่อนหน้าเช่นกัน แต่สิ่งเหล่านี้ไม่ได้ทดสอบเป็นประจำ
เราติดแท็กและปล่อยอัญมณีตามหลักการเวอร์ชันความหมาย
อันเป็นผลมาจากนโยบายนี้คุณสามารถ (และควร) ระบุการพึ่งพาอัญมณีนี้โดยใช้ข้อ จำกัด ในแง่ร้ายของรุ่นที่มีความแม่นยำสองหลัก
ตัวอย่างเช่น:
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
นอกจากนี้ยังมีกลุ่ม Google+ และรายชื่อผู้รับจดหมายหากคุณติดอยู่หรือเพียงแค่ต้องการพูดคุยเกี่ยวกับบางสิ่ง
หากคุณต้องการติดตั้งเป็นอัญมณีที่ลงนามใบรับรองสาธารณะของผู้ลงนาม GEM สามารถพบได้ในไดเรกทอรี certs ของที่เก็บ
PG สามารถเลือกพิมพ์ค่าผลลัพธ์และพารามิเตอร์การสืบค้นในรหัส RUBY หรือ CODE C สิ่งนี้สามารถเพิ่มความเร็วในการถ่ายโอนข้อมูลไปและกลับจากฐานข้อมูลเนื่องจากการจัดสรรสตริงจะลดลงและการแปลงในรหัสทับทิม (ช้ากว่า) สามารถละเว้นได้
การหล่อแบบพื้นฐานมากสามารถเปิดใช้งานได้โดย:
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 นั้นปรับแต่งได้สูง นั่นเป็นเหตุผลว่าทำไมจึงแบ่งออกเป็น 2 ชั้น:
นี่คือเลเยอร์ล่างที่มีคลาสการเข้ารหัสที่แปลงวัตถุทับทิมสำหรับการส่งไปยัง DBMS และคลาสถอดรหัสเพื่อแปลงข้อมูลที่ได้รับกลับไปเป็นวัตถุทับทิม ชั้นเรียนจะไม่ถูกกำหนดตามรูปแบบและทิศทางของพวกเขาใน pg :: textencoder, pg :: textdecoder, pg :: binaryencoder และ pg :: binarydecoder
เป็นไปได้ที่จะกำหนดประเภท OID รหัสรูปแบบ (ข้อความหรือไบนารี) และเลือกชื่อให้กับวัตถุตัวเข้ารหัสหรือตัวถอดรหัส นอกจากนี้ยังเป็นไปได้ที่จะสร้างประเภทคอมโพสิตโดยการกำหนดตัวเข้ารหัส/ถอดรหัสองค์ประกอบ PG :: วัตถุ Coder สามารถใช้ในการตั้งค่า PG :: TypEmap หรืออีกทางเลือกหนึ่งเพื่อแปลงค่าเดียวเป็น/จากการแสดงสตริงของพวกเขา
ประเภทคอลัมน์ PostgreSQL ต่อไปนี้ได้รับการสนับสนุนโดย Ruby-PG (TE = Text Encoder, TD = ตัวถอดรหัสข้อความ, be = binary encoder, bd = ตัวถอดรหัสไบนารี):
ข้อความต่อไปนี้และรูปแบบไบนารีสามารถเข้ารหัสได้แม้ว่าจะไม่ได้ใช้เป็นประเภทคอลัมน์:
TypEmap กำหนดค่าที่จะถูกแปลงโดยตัวเข้ารหัส/ถอดรหัส มีกลยุทธ์แผนที่ประเภทที่แตกต่างกันซึ่งนำมาใช้โดยหลาย ๆ รายการของคลาสนี้ พวกเขาสามารถเลือกและกำหนดค่าตามความต้องการเฉพาะสำหรับการหล่อประเภท แผนที่ประเภทเริ่มต้นคือ pg :: typemapallstrings
สามารถกำหนดแผนที่ประเภทต่อการเชื่อมต่อหรือต่อการสืบค้นตามลำดับตามชุดผลลัพธ์ พิมพ์แผนที่ยังสามารถใช้สำหรับการคัดลอกการสตรีมข้อมูล ดู pg :: การเชื่อมต่อ#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 ที่แนะนำใน Ruby-3.0 ตั้งแต่ PG-1.3.0 บน Windows Support สำหรับ Fiber.scheduler มีให้บริการบน Ruby-3.1 หรือใหม่กว่า การปิดกั้นการดำเนินการ IO ทั้งหมดจะถูกส่งผ่าน Fiber.scheduler หากมีการลงทะเบียนสำหรับเธรดที่กำลังทำงานอยู่ นั่นคือเหตุผลที่ PG ใช้อินเตอร์เฟส LIBPQ แบบอะซิงโครนัสภายในแม้กระทั่งการเรียกวิธีการซิงโครนัส/การบล็อก นอกจากนี้ยังใช้ความละเอียด DNS ของ Ruby แทนฟังก์ชั่นในตัวของ LIBPQ
PG ภายในใช้โหมดการเชื่อมต่อที่ไม่บล็อกของ LIBPQ เสมอ จากนั้นจะทำตัวเหมือนวิ่งในโหมดการบล็อก แต่ทำให้มั่นใจได้ว่าการปิดกั้น IO ทั้งหมดได้รับการจัดการในทับทิมผ่าน Fiber.scheduler ที่ลงทะเบียน เมื่อ PG::Connection.setnonblocking(true) ถูกเรียกว่าสถานะการไม่ปิดกั้นยังคงเปิดใช้งาน แต่การจัดการสถานะการปิดกั้นเพิ่มเติมจะถูกปิดใช้งานเพื่อให้โปรแกรมการโทรต้องจัดการกับสถานะการบล็อกด้วยตัวเอง
ข้อยกเว้นสำหรับกฎนี้คือวิธีการสำหรับวัตถุขนาดใหญ่เช่น PG::Connection#lo_create และวิธีการตรวจสอบโดยใช้ไลบรารีภายนอก (เช่นการตรวจสอบ GSSAPI) พวกเขาไม่สามารถใช้งานได้กับ Fiber.scheduler ดังนั้นการปิดกั้นรัฐจะไม่ถูกส่งผ่านไปยังตาราง IO ที่ลงทะเบียน นั่นหมายความว่าการดำเนินการจะทำงานอย่างถูกต้อง แต่สถานะการรอของ IO ไม่สามารถใช้เพื่อเปลี่ยนไปใช้เส้นใยอื่นที่ทำ IO ได้
PG เข้ากันได้อย่างเต็มที่กับ Ractor ที่แนะนำใน Ruby-3.0 ตั้งแต่ PG-1.5.0 ทุกประเภท en/decoders และแผนที่ประเภทสามารถแชร์ได้ระหว่าง ractors หากพวกเขาถูกแช่แข็งโดย Ractor.make_shareable ยังแช่แข็ง pg :: ผลลัพธ์และ pg :: วัตถุ tuple สามารถแบ่งปันได้ วัตถุแช่แข็งทั้งหมด (ยกเว้น PG :: การเชื่อมต่อ) ยังสามารถใช้ในการสื่อสารกับเซิร์ฟเวอร์ PostgreSQL หรืออ่านข้อมูลที่ดึงมาได้
PG :: การเชื่อมต่อไม่สามารถแชร์ได้และจะต้องสร้างภายในแต่ละ ractor เพื่อสร้างการเชื่อมต่อเฉพาะ
ในการรายงานข้อบกพร่องคุณลักษณะแนะนำหรือตรวจสอบแหล่งที่มาด้วย 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
ตรวจสอบให้แน่ใจว่าข้อบกพร่องและคุณสมบัติใหม่ทั้งหมดได้รับการตรวจสอบโดยการทดสอบ
ผู้ดูแลปัจจุบันคือ Michael Granger [email protected] และ Lars Kanis [email protected]
ลิขสิทธิ์ (c) 1997-2022 โดยผู้เขียน
คุณสามารถแจกจ่ายซอฟต์แวร์นี้ใหม่ภายใต้ข้อกำหนดเดียวกันกับทับทิมเอง ดู https://www.ruby-lang.org/en/about/license.txt หรือไฟล์ BSDL ในแหล่งข้อมูลสำหรับรายละเอียด
บางส่วนของรหัสมาจากโครงการ PostgreSQL และมีการแจกจ่ายภายใต้ข้อกำหนดของใบอนุญาต PostgreSQL ซึ่งรวมอยู่ในไฟล์ Postgres
ส่วนลิขสิทธิ์ Laika, Inc.
ดูผู้ร่วมให้ข้อมูลสำหรับคนที่ดีเพิ่มเติมมากมายที่มีส่วนร่วมในห้องสมุดนี้ในช่วงหลายปีที่ผ่านมา
เราขอขอบคุณผู้คนในรายการจดหมายทับทิมและทับทิม-ดีฟ และสำหรับผู้ที่พัฒนา PostgreSQL