1. Pendahuluan
Pengenalan PostgreSQL
Ketika kita menanyakan tentang solusi database kepada para pengembang, biasanya mereka akan menjawabnya dengan dua database utama. Yang pertama adalah MySQL, sedangkan yang kedua adalah apa yang akan kita bahas di sini, yaitu PostgreSQL. Kelebihan dari masing-masing database sering menyebabkan perdebatan panjang, tetapi pada dasarnya, PostgreSQL memiliki lebih banyak firm grasp pada struktur database relasional daripada MySQL. Kebanyakan fitur standar seperti FOREIGN KEY baru ditambahkan di MySQL 5. Tetapi, apapun keadaannya, dokumen ini menganggap anda telah memiliki PostgreSQL. Langkah pertama yang akan kita lakukan adalah proses emerge. Bagian berikut ini akan menjelaskannya bersama konfigurasi dasar PostgreSQL.
Instalasi PostgreSQL
Untuk memulai kita harus menginstal paket PostgreSQL. Untuk melakukannya, jalankan dahulu perintah berikut untuk memastikan bahwa opsi-opsinya sudah ditetapkan dengan benar:
| Daftar Kode 1.1: Memeriksa opsi-opsi kompilasi PostgreSQL |
# emerge -pv postgresql These are the packages that I would merge, in order: Calculating dependencies ...done! [ebuild N ] dev-db/postgresql-8.0.4 -doc -kerberos +nls +pam +perl -pg-intdatetime +python +readline (-selinux) +ssl -tcl +xml +zlib 0 kB |
Berikut ini adalah daftar dari opsi-opsi kompilasi:
| Flag USE | Penjelasan |
| doc | Flag USE ini mengaktifkan atau menonaktifkan instalasi dokumentasi selain halaman manual standar. Anda sebaiknya menonaktifkan opsi ini jika anda hanya memiliki sedikit sisa ruang kosong di harddisk, karena anda masih bisa membaca dokumentasi online. |
| kerberos | Ketika melakukan koneksi ke database, jika opsi ini diaktifkan, admin memiliki pilihan untuk menggunakan kerberos untuk mengotentikasi pengguna/layanannya ke database. |
| nls | Jika opsi ini diaktifkan, PostgreSQL dapat menterjemahkan kalimat-kalimat yang digunakannya ke bahasa selain Inggris. |
| pam | Jika opsi ini diaktifkan dan admin sudah mengatur file konfigurasi PostgreSQL dengan benar, pengguna/servis akan dapat login ke database PostgreSQL dengan menggunakan PAM (Pluggable Authentication Module). |
| perl | Jika opsi ini diaktifkan, perl binding untuk PostgreSQL akan diikutsertakan. |
| pg-intdatetime | Jika opsi ini diaktifkan, PostgreSQL akan mendukung tipe data integer 64 bit. |
| python | Jika opsi ini diaktifkan PostgreSQL akan dikompilasi dengan dukungan python bindings. |
| readline | Jika opsi ini diaktifkan PostgreSQL akan mendukung gaya pengeditan baris perintah readline. Ini termasuk sejarah perintah dan isearch. |
| selinux | Jika opsi ini diaktifkan, sebuah polis selinux untuk PostgreSQL akan diinstal. |
| ssl | Jika opsi ini diaktifkan, PostgreSQL akan akan memanfaatkan pustaka openssl untuk mengenkripsi lalu lintas antara klien klien PostgreSQL dan server. |
| tcl | Jika opsi ini diaktifkan, PostgreSQL akan mendapatkan tcl bindings. |
| xml | Jika opsi ini diaktifkan, dukungan XPATH xml akan diikutsertakan. Informasi lebih rinci tentang penggunaan dukungan xml dengan PostgreSQL bisa anda dapatkan di halaman PostgreSQL and XML. |
| zlib | Opsi ini tidak benar-benar diperlukan oleh PostgreSQL sendiri, tetapi diperlukan oleh pg_dump untuk memadatkan data yang dihasilkan. |
Setelah anda menyesuaikan flag USE, mulailah proses emerge:
| Daftar Kode 1.2: Instalasi PostgreSQL |
# emerge postgresql (Output dipotong) >>> /usr/lib/libecpg.so.5 -> libecpg.so.5.0 >>> /usr/bin/postmaster -> postgres * Make sure the postgres user in /etc/passwd has an account setup with /bin/bash as the shell * * Execute the following command * emerge --config =postgresql-8.0.4 * to setup the initial database environment. * >>> Regenerating /etc/ld.so.cache... >>> dev-db/postgresql-8.0.4 merged. |
Seperti yang ditunjukkan oleh output einfo, ada beberapa pengaturan pasca instalasi yang harus anda lakukan. Bagian berikut ini akan menjelaskannya.
2. Konfigurasi PostgreSQL
Pengaturan lingkungan database dasar
Seperti yang diberitahukan oleh output emerge tadi, lingkungan database dasar harus diatur. Namun begitu, sebelum kita melakukannya, kita harus mempertimbangkan satu hal. Tidak seperti — katakanlah MySQL –, password root PostgreSQL adalah password root yang sesungguhnya. Ebuild hanya menciptakan user, tetapi tidak menetapkan passwordnya. Untuk itu, kita harus menetapkan dahulu password untuk user postgres:
| Daftar Kode 2.1: Menetapkan password |
# passwd postgres New UNIX password: Retype new UNIX password: passwd: password updated successfully |
Selanjutnya, kita dapat melanjutkan ke pengaturan lingkungan database dasar.
| Daftar Kode 2.2: Konfigurasi lingkungan database dengan emerge –config |
# emerge --config =postgresql-8.0.4 Configuring pkg... * Creating the data directory ... * Initializing the database ... The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale C. fixing permissions on existing directory /var/lib/postgresql/data ... ok creating directory /var/lib/postgresql/data/global ... ok creating directory /var/lib/postgresql/data/pg_xlog ... ok creating directory /var/lib/postgresql/data/pg_xlog/archive_status ... ok creating directory /var/lib/postgresql/data/pg_clog ... ok creating directory /var/lib/postgresql/data/pg_subtrans ... ok creating directory /var/lib/postgresql/data/base ... ok creating directory /var/lib/postgresql/data/base/1 ... ok creating directory /var/lib/postgresql/data/pg_tblspc ... ok selecting default max_connections ... 100 selecting default shared_buffers ... 1000 creating configuration files ... ok creating template1 database in /var/lib/postgresql/data/base/1 ... ok initializing pg_shadow ... ok enabling unlimited row size for system tables ... ok initializing pg_depend ... ok creating system views ... ok loading pg_description ... ok creating conversions ... ok setting privileges on built-in objects ... ok creating information schema ... ok vacuuming database template1 ... ok copying template1 to template0 ... ok WARNING: enabling "trust" authentication for local connections You can change this by editing pg_hba.conf or using the -A option the next time you run initdb. Success. You can now start the database server using: /usr/bin/postmaster -D /var/lib/postgresql/data or /usr/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start * * You can use /etc/init.d/postgresql script to run PostgreSQL instead of pg_ctl. * |
Sekarang lingkungan database dasar sudah siap. Bagian selanjutnya akan mejelaskan cara memeriksa instalasi dan mengatur pengguna yang boleh mengakses database.
Pengaturan Database PostgreSQL
Sekarang adalah waktu yang tepat untuk memeriksa instalasi kita. Pertama, pastikan bahwa servis dapat dijalankan dengan benar:
| Daftar Kode 2.3: Menjalankan servis PostgreSQL |
# /etc/init.d/postgresql start * Starting PostgreSQL ... [ ok ] |
Jika servis sudah bagus, kita juga sebaiknya menambahkannya ke runlevel default agar langsung dijalankan ketika boot:
| Daftar Kode 2.4: Menambahkan postgresql ke runlevel default |
# rc-update add postgresql default * postgresql added to runlevel default |
Selanjutnya kita akan mencoba mengatur database percobaan. Untuk memulai, mari kita ciptakan sebuah database percobaan baru dengan perintah createdb. Kita juga akan menggunakan opsi -U untuk menetapkan user-nya (default-nya adalah nama user saat ini), dan opsi -W untuk meminta password yang sebelumnya telah kita tetapkan. Terakhir, kita berikan nama database yang ingin kita ciptakan:
| Daftar Kode 2.5: Menciptakan database dengan createdb |
$ createdb -U postgres -W test Password: CREATE DATABASE |
Database berhasil diciptakan dengan sukses, dan kita bisa memastikan bahwa database tersebut dapat menjalankan tugas-tugas dasar. Kita akan berlanjut dengan menghapus database ini dengan perintah dropdb:
| Daftar Kode 2.6: Menghapus database dengan dropdb |
$ dropdb -U postgres -W test Password: DROP DATABASE |
Saat ini, hanya user postgres yang dapat menjalankan perintah. Tentu saja, ini bukanlah pengaturan yang bagus untuk lingkungan multi-user. Bagian selanjutnya akan menjelaskan pengaturan akun user.
Pengaturan akun user database
Seperti yang telah kita bicarakan tadi, login sebagai user postgres kurang baik jika dilakukan di lingkungan multi-user. Pada kebanyakan kasus, akan ada banyak user dan servis yang mengakses server, dan masing-masing memiliki kebutuhan serta hak yang berbeda-beda. Jadi, untuk mengatasi masalah ini, kita akan menggunakan perintah createuser. Perintah ini adalah sebuah alternatif untuk menjalankan beberapa query SQL, dan jauh lebih luwes jika dilihat dari sisi administrasi. Kita akan membuat dua akun user; ‘superuser’ yang dapat menambahkan user lain dan melakukan administrasi database, dan user biasa.
| Daftar Kode 2.7: Membuat akun superuser |
(Gantikan chris dengan nama user yang ingin anda gunakan) $ createuser -a -d -P -E -U postgres -W chris Enter password for new user: Enter it again: Password: CREATE USER |
Nah, kita sudah menciptakan superuser. Opsi -a menetapkan user ini dapat menambahkan/membuat akun user. Opsi -d berarti user ini dapat menciptakan database. Opsi -P mengizinkan anda untuk menetapkan password untuk user ini dan opsi -E mengenkripsinya untuk alasan keamanan. Sekarang, kita akan menguji hak yang dimiliki oleh user ini dengan membuat akun user biasa:
| Daftar Kode 2.8: Membuat akun user biasa |
(Gantikan chris dengan nama user yang baru saja anda ciptakan) $ createuser -A -D -P -E -U chris -W testuser Enter password for new user: Enter it again: Password: CREATE USER |
Sukses! Akun user baru kita berhasil diciptakan dengan menggunakan akun superuser. Opsi -A dan -D adalah kebalikan dari opsi -a dan -d yaitu tidak mengizinkan user untuk membuat akun user dan database. Bagian selanjutnya menjelaskan cara menggunakan database baru.
3. Menggunakan PostgreSQL
Mengatur perizinan
Sekarang kita sudah memiliki akun user yang dapat menciptakan database dan membuat akun user baru, serta akun user yang memiliki hak tak terbatas. Akun user yang telah kita ciptakan tadi sekarang sudah bisa login ke server, dan haya itu saja. Secara umum, user harus mendapatkan hak untuk menambahkan dan menerima data, dan terkadang, memiliki hak untuk melakukan sejumlah tugas lainnya. Untuk itu, kita harus mengatur perizinan/hak user. Ini mudah sekali dilakukan dengan menambahkan parameter -O ke perintah createdb. Kita akan memulai dengan membuat database baru bernama MyDB yang akan dimiliki oleh testuser dengan menggunakan akun superuser:
| Daftar Kode 3.1: Membuat database MyDB |
$ createdb -O testuser -U chris -W MyDB Password: CREATE DATABASE |
OK, kita sekarang sudah memiliki database baru bernama MyDB, dan testuser dapat mengaksesnya. Untuk mencobanya, kita akan login sebagai testuser ke database MyDB. Kita melakukannya dengan program psql. Program ini adalah program yang digunakan untuk melakuan koneksi ke database PostgreSQL dari baris perintah. Jadi sekarang, masuklah ke database seperti ini:
| Daftar Kode 3.2: Masuk ke database MyDB sebagai testuser |
$ psql -U testuser -W MyDB Password: Welcome to psql 8.0.4, the PostgreSQL interactive terminal. Type: copyright for distribution terms h for help with SQL commands ? for help with psql commands g or terminate with semicolon to execute query q to quit MyDB=> |
Sekarang testuser sudah login ke database, dan dapat mulai menjalankan beberapa perintah. Bagian selanjutnya akan menjelaskan beberapa peintah dasar terkait penggunaan klien psql.
Perintah-perintah dasar PostgreSQL dan pembuatan tabel
Bagi anda yang sudah terbiasa dengan MySQL, anda harus membaca bagian ini. Di sinilah letak keunikan PostgreSQL dalam cara menjalankan perintah. Untuk memulai, berikut ini adalah daftar dari beberapa perinta yang akan kita diskusikan:
| Perintah | Kegunaan | Persamaan pada MySQL |
| c[onnect] [DBNAME|- [USER]] | Melakukan koneksi ke database | USE DATABASE |
| q | Keluar dari klien psql | quit |
| i FILE | Menjalankan program dari FILE | source FILE |
| o [FILE] | Mengirimkan hasil query ke FILE | INTO OUTFILE, tetapi memberikan semua output (tidak hanya SELECTS) |
| d [NAME] | Menjelaskan sebuah database atau table (juga item lain) | DESC(RIBE) |
| db [PATTERN] | Melihat tabel yang tersedia yang cocok dengan PATTERN (menampilkan semua tabel jika PATTERN tidak diberikan) | SHOW TABLES |
Kecuali c[onnect], semua perintah yang disebutkan di atas akan kita gunakan di panduan ini. Untuk sekarang, database masih kosong, untuk itu kita perlu menambahkan beberapa data. Langkah pertama untuk melakukannya adalah meletakkannya di dalam tabel. Database kita saat ini belum berisi tabel, jadi kita harus membuatnya dahulu, yaitu dengan perintah CREATE TABLE. Kita akan membuat tabel yang berisi ID produk, Penjelasan, dan harga:
| Daftar Kode 3.3: Membuat tabel produk |
MyDB=> CREATE TABLE produk ( MyDB(> id_produk SERIAL, MyDB(> penjelasan TEXT, MyDB(> harga DECIMAL MyDB(> ); NOTICE: CREATE TABLE will create implicit sequence "products_product_id_seq" for serial column "products.product_id" CREATE TABLE |
Anda boleh mengabaikan NOTICE, karena sama sekali tidak membahayakan. Dari baris terakhir, kita bisa melihat bahwa perintah berhasil dilaksankan dengan sukses. Sekarang, kita akan memeriksa apakah tabel benar-benar telah diciptakan dengan menggunakan perintah d:
| Daftar Kode 3.4: Melihat tabel baru |
MyDB=> d produk
Table "public.products"
Column | Type | Modifiers
-------------+---------+------------------------------------------------------------------
id_produk | integer | not null default nextval('public.products_product_id_seq'::text)
penjelasan | text |
harga | numeric |
|
Ternyata tabel kita benar-benar telah diciptakan. Sekarang saatnya untuk mengisi tabel tersebut dengan data. Bagian selanjutnya akan menjelaskan cara mengisi database dengan data.
Mengisi data ke dalam database
Bagian ini menjelaskan dua cara untuk mengisi tabel baru dengan data. Pertama, kita akan menggunakan perintah paling dasar, INSERT:
| Daftar Kode 3.5: Sintaks INSERT |
INSERT INTO [tablename] (column1,column2,column3) VALUES(value1,value2,value3) |
tablename adalah nama tabel yang ingin kita isi dengan data. Dengan (column1,column2,column3) anda dapat menentukan kolom mana saja yang ingin anda isikan data. VALUES(value1,value2,value3) adalah data yang ingin kita isikan, dengan urutan yang sama seperti (column1 gets value1, column2 gets value2, column3 gets value3). Urutan ini harus sama. Sekarang mari kita isikan data ke dalam tabel:
| Penting: Berdasarkan pengalaman, penulis menganjurkan anda untuk menggunakan statemen INSERT persis seperti pada contoh di atas. Seorang pengembang terkadang melakukan kesalahan ketika menggunakan INSERT INTO tanpa menentukan kolom yang akan diisi dengan data. Cara ini kurang produktif, karena kita akan mendapatkan masalah ketika menambahkan kolom baru ke dalam database, yang disebabkan oleh urutan kolom yang telah berubah. Anda harus selalu menentukan kolom pada perintah INSERT INTO kecuali jika anda yakin 300% bahwa anda tidak akan pernah menambahkan kolom lagi. |
| Daftar Kode 3.6: Mengisi data ke dalam kolom |
MyDB=> INSERT INTO produk (penjelasan,harga) VALUES('A test product', 12.00);
INSERT 17273 1
|
Baris terakhir memerlukan penjelasan yang lebih panjang. Hasil dari perintah INSERT adalah sebuah OID (Object Identifier) dan jumlah baris yang diisi. Penjelasan tentang OID kurang sesuai untuk dibahas di sini, jadi sebaiknya anda membaca manual PostgreSQL untuk memahaminya. Nah, jika anda memiliki 20.000 produk, statemen INSERT akan menjadi sedikit lebih rumit. Namun begitu, anda dapat menggunakan perintah COPY untuk memasukkan data ke dalam tabel dari sebuah file atau stdin. Pada contoh ini, penulis menganggap anda memiliki sebuah file csv (comma separated values) yang berisi id produk, penjelasan, dan harga. Isi file tersebut kira-kira seperti ini:
| Daftar Kode 3.7: produk.csv |
2,meat,6.79 3,soup,0.69 4,soda,1.79 |
Sekarang kita akan menggunakan perintah COPY untuk memasukkan data kita:
| Penting: Kita menggunakan perintah COPY FROM STDIN karena hanya user postgres-lah yang dapat memasukkan data dari sebuah file (tentunya karena alasan keamanan). |
| Daftar Kode 3.8: Menggunakan COPY untuk mengisi tabel produk |
MyDB=> COPY produk FROM STDIN WITH DELIMITER AS ','; Enter data to be copied followed by a newline. End with a backslash and a period on a line by itself. >> 2,meat,6.79 >> 3,soup,0.69 >> 4,soda,1.79 >> . |
Sayangnya, baris ini tidak menghasilkan informasi status yang sama seperti perintah INSERT INTO. Bagaimana kita bisa mengetahui jika data sudah diisi? Bagian berikut akan menjelaskannya untuk anda:
Menggunakan query PostgreSQL
Bagian ini menjelaskan cara menggunakan statemen SELECT untuk melihat data di dalam tabel. Format dasar SELECT adalah sebagai berikut:
| Daftar Kode 3.9: Sintaks SELECT |
SELECT (column1,column2|*) FROM (table) [WHERE (conditionals)] |
Ada dua cara untuk memilih kolom. Cara pertama adalah dengan menggunakan * untuk memilih semua kolom, sedangkan langkah kedua adalah dengan menentukan kolom tertentu yang ingin anda lihat. Cara kedua lebih baik digunakan jika anda ingin mencari kolom tertentu di dalam sebuah tabel besar. mari kita mulai dengan * untuk memilih semua kolom:
| Daftar Kode 3.10: Melihat isi tabel produk |
MyDB=> SELECT * FROM produk; id_produk | penjelasan | harga ------------+----------------+------- 1 | A test product | 12.00 2 | meat | 6.79 3 | soup | 0.69 4 | soda | 1.79 (4 rows) |
Seperti yang bisa anda lihat, semua data yang sebelumnya kita isi, sudah benar-benar ada di dalam tabel. Sekarang katakanlah kita tidak ingin melihat id produk, tetapi hanya ingin melihat bagian penjelasan dan harganya. Untuk itu, kita gunakan format lain dari SELECT:
| Daftar Kode 3.11: Melihat kolom tertentu dari tabel produk |
MyDB=> SELECT penjelasan,harga FROM produk; penjelasan | harga ----------------+------- A test product | 12.00 meat | 6.79 soup | 0.69 soda | 1.79 (4 rows) |
Sekarang hanya penjelasan dan harga yang ditampilkan, sehingga kita dapat berfokus pada data penting yang ingin kita lihat. Nah, sekarang anggaplah kita hanya ingin melihat produk yang harganya lebih dari $2.00. Di sinilah perintah WHERE berguna:
| Daftar Kode 3.12: Melihat baris tertentu dari tabel produk |
MyDB=> SELECT penjelasan,harga FROM produk WHERE harga > 2.00; description | price ----------------+------- A test product | 12.00 meat | 6.79 (2 rows) |
Sekarang kita mendapatkan daftar produk yang harganya lebih dari $2.00. Format ini sangat berguna dan dapat membantu kita ketika membuat laporan yang bagus.
Penutup
Bagian ini menutup Panduan PostgreSQL. Terima kasih sebanyak-banyaknya kepada Masatomo Nakano, pengurus paket PostgreSQL Gentoo terdahulu atas bantuannya dengan menjawab pertanyaan-pertanyaan dari penulis. Kirimkan saran anda untuk panduan ini ke Chris White. Untuk mendapatkan dokumentasi yang lebih terinci, kunjungilah website PostgreSQL.
