PG adalah antarmuka Ruby ke RDBMS PostgreSQL. Ini bekerja dengan PostgreSQL 10 dan yang lebih baru.
Contoh Penggunaan Kecil:
#!/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 

Ini biasanya berfungsi dengan versi Ruby/PostgreSQL sebelumnya juga, tetapi itu tidak diuji secara teratur.
Kami menandai dan melepaskan permata sesuai dengan prinsip versi semantik.
Sebagai hasil dari kebijakan ini, Anda dapat (dan harus) menentukan ketergantungan pada permata ini menggunakan kendala versi pesimistis dengan dua digit presisi.
Misalnya:
spec . add_dependency 'pg' , '~> 1.0' Instal melalui Rubygems:
gem install pg
Anda mungkin perlu menentukan jalur ke program 'PG_CONFIG' yang diinstal dengan Postgres:
gem install pg -- --with-pg-config=<path to pg_config>
Jika Anda menginstal melalui Bundler, Anda dapat memberikan petunjuk kompilasi seperti itu:
bundle config build.pg --with-pg-config=<path to pg_config>
Lihat readMe-os_x.rdoc untuk informasi lebih lanjut tentang menginstal di bawah macOS X, dan readme-windows.rdoc untuk instruksi windows build/instalasi.
Ada juga grup Google+ dan milis jika Anda macet, atau hanya ingin mengobrol tentang sesuatu.
Jika Anda ingin menginstal sebagai permata yang ditandatangani, sertifikat publik penandatangan GEM dapat ditemukan di direktori certs repositori.
PG secara opsional dapat mengetikkan nilai hasil cast dan parameter kueri dalam kode C ruby atau asli. Ini dapat mempercepat transfer data ke dan dari database, karena alokasi string dikurangi dan konversi dalam kode ruby (lebih lambat) dapat dihilangkan.
Casting tipe yang sangat mendasar dapat diaktifkan oleh:
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}"]]Tapi casting tipe PG sangat dapat disesuaikan. Itu sebabnya dibagi menjadi 2 lapisan:
Ini adalah lapisan bawah, yang berisi kelas pengkodean yang mengonversi objek ruby untuk transmisi ke kelas DBM dan decoding untuk mengonversi data yang diterima kembali ke objek Ruby. Kelas -kelasnya dinamai sesuai dengan format dan arah mereka di PG :: Textencoder, PG :: TextDecoder, PG :: Binaryencoder dan PG :: BinaryDecoder.
Dimungkinkan untuk menetapkan jenis OID, kode format (teks atau biner) dan secara opsional nama untuk objek enkoder atau decoder. Dimungkinkan juga untuk membangun tipe komposit dengan menetapkan elemen encoder/decoder. PG :: Coder Objects dapat digunakan untuk mengatur PG :: Typemap atau sebagai alternatif untuk mengonversi nilai tunggal ke/dari representasi string mereka.
Jenis kolom PostgreSQL berikut ini didukung oleh ruby-pg (TE = encoder teks, TD = Decoder Teks, BE = Encoder Biner, BD = Biner Decoder):
Teks dan format biner berikut juga dapat dikodekan meskipun tidak digunakan sebagai tipe kolom:
TypeMap mendefinisikan nilai mana yang akan dikonversi oleh enkoder/decoder mana. Ada berbagai strategi peta jenis, yang diimplementasikan oleh beberapa derivasi kelas ini. Mereka dapat dipilih dan dikonfigurasi sesuai dengan kebutuhan khusus untuk casting tipe. Peta tipe default adalah pg :: typemapallstrings.
Peta jenis dapat ditetapkan per koneksi atau per kueri masing -masing per set hasil. Jenis peta juga dapat digunakan untuk menyalin dan keluar streaming data. Lihat PG :: Koneksi#copy_data.
Peta jenis dasar berikut tersedia:
Peta jenis berikut lebih disukai dengan pemetaan jenis dari PG :: BasictipeRegistry:
PG adalah utas yang aman sedemikian rupa sehingga berbagai utas dapat menggunakan objek PG :: koneksi yang berbeda secara bersamaan. Namun tidak aman untuk mengakses objek PG secara bersamaan dari lebih dari satu utas. Jadi pastikan untuk membuka koneksi server database baru untuk setiap utas baru atau menggunakan pustaka pembungkus seperti ActiveSecord yang mengelola koneksi dengan cara yang aman.
Jika pesan seperti berikut dicetak ke Stderr, Anda mungkin menggunakan satu koneksi dari beberapa utas:
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 sepenuhnya kompatibel dengan Fiber.scheduler . Pada dukungan Windows untuk Fiber.scheduler tersedia di Ruby-3.1 atau yang lebih baru. Semua kemungkinan pemblokiran operasi IO dialihkan melalui Fiber.scheduler . Itulah sebabnya PG secara internal menggunakan antarmuka LIBPQ asinkron bahkan untuk panggilan metode sinkron/pemblokiran. Ini juga menggunakan resolusi DNS Ruby alih -alih fungsi builtin LIBPQ.
PG secara internal selalu menggunakan mode koneksi nonblocking dari libpq. Kemudian berperilaku seperti berjalan dalam mode pemblokiran tetapi memastikan, bahwa semua pemblokiran IO ditangani di Ruby melalui Fiber.scheduler yang mungkin terdaftar. Ketika PG::Connection.setnonblocking(true) dipanggil maka keadaan nonblocking tetap diaktifkan, tetapi penanganan tambahan status pemblokiran dinonaktifkan, sehingga program panggilan harus menangani status pemblokiran dengan sendirinya.
Pengecualian untuk aturan ini adalah metode untuk objek besar seperti PG::Connection#lo_create dan metode otentikasi menggunakan pustaka eksternal (seperti otentikasi GSSAPI). Mereka tidak kompatibel dengan Fiber.scheduler . Itu berarti operasi akan bekerja dengan baik, tetapi status menunggu IO tidak dapat digunakan untuk beralih ke serat lain yang melakukan IO.
PG sepenuhnya kompatibel dengan ractor yang diperkenalkan di Ruby-3.0 sejak PG-1.5.0. Semua tipe en/decoder dan peta jenis dapat dibagikan di antara ractor jika dibuat dibekukan oleh Ractor.make_shareable . Juga beku PG :: hasil dan pg :: objek tuple dapat dibagikan. Semua objek beku (kecuali PG :: Connection) masih dapat digunakan untuk melakukan komunikasi dengan server PostgreSQL atau membaca data yang diambil.
PG :: Koneksi tidak dapat dibagikan dan harus dibuat dalam setiap ractor untuk membuat koneksi khusus.
Untuk melaporkan bug, menyarankan fitur, atau memeriksa sumbernya dengan git, periksa halaman proyek.
Setelah memeriksa sumbernya, instal semua dependensi:
$ bundle install
File ekstensi pembersihan, file pengemasan, database uji. Jalankan ini untuk berubah antara versi PostgreSQL:
$ rake clean
Kompilasi ekstensi:
$ rake compile
Jalankan tes/spesifikasi pada versi postgresql yang point pg_config --bindir point ke:
$ rake test
Atau jalankan tes tertentu per file dan nomor baris pada versi PostgreSQL tertentu:
$ PATH=/usr/lib/postgresql/14/bin:$PATH rspec -Ilib -fd spec/pg/connection_spec.rb:455
Menghasilkan dokumentasi API:
$ rake docs
Pastikan, bahwa semua bug dan fitur baru diverifikasi oleh tes.
Pemelihara saat ini adalah Michael Granger [email protected] dan Lars Kanis [email protected].
Hak Cipta (C) 1997-2022 oleh penulis.
Anda dapat mendistribusikan kembali perangkat lunak ini dengan istilah yang sama dengan Ruby itu sendiri; Lihat https://www.ruby-lang.org/en/about/license.txt atau file bsdl di sumber untuk detailnya.
Bagian dari kode berasal dari proyek PostgreSQL, dan didistribusikan berdasarkan ketentuan lisensi PostgreSQL, termasuk dalam file postgres.
Porsi Hak Cipta Laika, Inc.
Lihat Kontributor.RDOC untuk banyak orang baik tambahan yang telah berkontribusi pada perpustakaan ini selama bertahun -tahun.
Kami berterima kasih kepada orang-orang di daftar ruby-list dan ruby-dev. Dan kepada orang -orang yang mengembangkan PostgreSQL.