|
Tahun III, Nomor 14, Juni 2001
|
|||
Konektivitas MySQL - Python |
||||
Home
Halaman Muka Penjadwalan Tugas dengan cron dan at Menyaring Pornografi dengan Squid dan Ipchains Tip StarWriter di StarOffice 5.2
|
1. Instalasi Paket MySQL-pythonUntuk menginstall paket konektivitas MySQL dan Python ini, anda memerlukan file-file berikut,
rpm -iv Distutils-1.0.1-1.noarch.rpm Proses ini akan meletakkan file-file pada direktori, saya menggunakan interpreter python versi 1.5, /usr/lib/python1.5/site-packages/distutils/. Langkah kedua adalah menginstall paket konektivitas MySQL dengan Python itu sendiri. File yang menyediakan fasilitas ini adalah MySQL-python-0.3.0.tar.gz. Karena file ini masih dalam bentuk file yang dimampatkan maka harus diurai dengan program tar:
tar xzvf MySQL-python-0.3.0.tar.gz Setelah selesai akan terbentuk direktory MySQL-python-0.3.0, dan proses instalasi yang sebenarnya bisa dimulai.
cd MySQL-python-0.3.0 python setup.py build python setup.py install Jika langkah ini berhasil tanpa menghasilkan pesan error akan terdapat file MySQLdb.py, _mysql.so, CompatMysqldb.py di direktory /usr/lib/python1.5/site-packages/ 2. Membuat database dan tabelUntuk mencoba konektivitas ini anda perlu membuat sebuah tabel dalam suatu database. Misalnya kita membuat satu tabel pelanggan dalam database warnet. Untuk membuat database warnet berikan perintah berikut ini pada program MySQL client (dengan asumsi user root belum mempunyai password),
mysql -u root create database warnet; grant all on warnet.* to warnet@localhost identified by 'linux20'; flush privileges; \q Tabel pelanggan, anda buat dengan menjalankan perintah ini,
mysql -u warnet -p warnet create table customer ( id int not null default '0' auto_increment primary key, name char(30) not null, pass char(10) not null, unique(name)); \q 3. Manipulasi tabel dalam lingkungan interaktif pythonPaket MySQLdb yang sudah terinstal dapat digunakan dalam prompt interaktif python. Di sini anda dapat memanipulasi isi dari tabel yang sudah anda buat sebelumnya. Mari kita menelusuri sedikit demi sedikit bagaimana memanfaatkan peralatan yang sudah kita pasang. Dimulai dengan mengaktifkan interpreter python dalam mode interaktif.
$python Python 1.5.2 (#1, Feb 1 2000, 16:32:16) [GCC egcs-2.91.66 19990314/Linux (egcs- on linux-i386 Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam >>> Agar dapat memanfaatkan paket MySQLdb dalam lingkungan python, maka interpreter python harus diberitahu mengenai hal ini.
>>> import MySQLdb Sekarang peralatan anda sudah siap untuk mengolah data pada server MySQL, karena modul MySQLdb sudah diperkenallkan. Komunikasi dengan MySQL server dapat dijalin dengan memanfaatkan method connect() dari class MySQLdb.
>>> dbconnect=MySQLdb.connect(host='localhost', user='warnet', passwd='linux20') Method ini mengharuskan kita memakai argumen dengan keyword, yaitu dalam bentuk 'keyword=nilai'. Selamat! anda sudah terhubung dengan MySQL server. Untuk memeriksanya jalankan perintah,
>>> dbconnect._server_info '3.23.32' Artinya hubungan dengan server MySQL versi 3.23.32 telah terjalin. Anda juga dapat mengetahui versi server MySQL anda dengan perintah berikut ini,
>>> dbconnect._server_version 32332 Pemilihan database yang akan diakses dipakai method select_db(). Sebagai contoh kita memilih databases bernama warnet.
>>> dbconnect.select_db('warnet') Sebelum menjalankan perintah-perintah query terhadap server MySQL, harus dibuat dulu sebuah instance dari kelas cursor. Pada objek cursor inilah kita akan menjalankan query-query terhadap tabel.
>>> pointer=dbconnect.cursor() 3.1 Menambahkan data ke dalam tablePerintah untuk menambahkan data pada sebuah server database insert. Perhatikan contoh berikut ini,
>>> pointer.execute("insert into customer (user_id, name, password, reg_date, bill_hour)\ ... values ('user01', 'Henry S.', password('user01'), now(), '5000')") 1L Display ''1L'' menunjukkan jumlah data yang berhasil dimasukkan pada server database SQL. Untuk membuktikan bahwa data sudah masuk, kita dapat meminta bantuan program client dari MySQL.
mysql> select * from customer; +---------+----------+------------+------------+-----------+ | user_id | name | password | reg_date | bill_hour | +---------+----------+------------+------------+-----------+ | user01 | Henry S. | 7491a64645 | 2001-04-10 | 5000.00 | +---------+----------+------------+------------+-----------+ 1 row in set (0.01 sec) 3.2 Mencari data dari tablePada dasarnya operasi untuk mencari data dalam suatu table sama dengan proses pengisian data. Hanya disini berbeda dalam perintah SQL-nya. Pandang tabel pelanggan warnet kita berisi data berikut,
+---------+---------------+------------+------------+-----------+ | user_id | name | password | reg_date | bill_hour | +---------+---------------+------------+------------+-----------+ | user01 | Henry S. | 7491a64645 | 2001-04-10 |5000.00 | | user02 | Salman AS | 7491a5a745 | 2001-04-11 |4500.00 | | user03 | Abdul Haris | 7491a38445 | 2001-04-12 |5000.00 | | user04 | Yahya Yanuar | 7491a1e545 | 2001-04-13 |4500.00 | | user05 | Sirojul Munir | 7491afc245 | 2001-04-13 |5000.00 | +---------+---------------+------------+------------+-----------+ Dalam mengolah data dalam tabel kita tetap menggunakan objek cursor.
>>> pointer.execute("select * from customer order by user_id") 5L baris perintah pertama menjalankan perintah SQL yang diberikan sebagai argument string. ''5L'' adalah tanggapan yang diberikan oleh interpreter python, yang berarti dalam menjalankan perintah SQL tersebut dihasilkan 5 data. 3.2.1 Method fetchall()Untuk mengambil data hasil query ini dipakai method fetchall(). Agar mempermudah proses pengolahan selanjutnya kita perlu membuat sebuah objek, misalnya hasil,
>>> hasil=pointer.fetchall() objek hasil akan menampung data hasil query. Untuk meyakinkan jumlah data yang berhasil dibaca jalankan perintah,
>>> pointer.rowcount 5L Ternyata hasilnya sama dengan perintah sebelumnya. Setelah perintah execute() dan fetchall(), informasi mengenai tabel akan disimpan dalam objek pointer, tepatnya pada atribut description, dan data hasil querynya disimpan dalam objek hasil. Untuk melihat informasi mengenai tabel yang diquery jalankan perintah
>>> pointer.description (('user_id', 253, 6, 10, 10, 0, 0), ('name', 253, 13, 30, 30, 0, 1), ('password', 253, 10, 10, 10, 0, 0), ('reg_date', 10, 10, 10, 10, 0, 1), ('bill_hour', 4, 7, 4, 4, 2, 1)) Informasi yang penting bagi kita dari data diatas adalah nama-nama field dari tabel customer. Sedangkan informasi yang lainnya adalah untuk kepentingan internal. Perhatikan juga objek hasil,
>>> hasil [('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0), ('user02', 'Salman AS', '7491a5a745', '2001-04-11', 4500.0), ('user03', 'Abdul Haris', '7491a38445', '2001-04-12', 5000.0), ('user04', 'Yahya Yanuar', '7491a1e545', '2001-04-13', 4500.0), ('user05', 'Sirojul Munir', '7491afc245', '2001-04-13', 5000.0)] Dari data ini dapat kita lihat bahwa hasil dari perintah fetchall() berupa array dari tuppel. Satu tupel berisi satu record data dari tabel. Ambil contoh tupel pertama. Urutan field-fieldnya adalah user_id, name, password, reg_date, dan bill_hour. Perhatikan juga penampilan dari field password! ini disebabakan pemakaian fungsi password() dari MySQL. Urutan field-field ini tergantung dari perintah SQL yang kita berikan. Untuk membuktikan jalankan query dengan SQL yang berbeda,
>>> pointer.execute("select user_id,name from customer order by user_id") 5L >>> hasil=pointer.fetchall() hasilnya akan seperti ini,
>>> hasil [('user01', 'Henry S.'), ('user02', 'Salman AS'), ('user03', 'Abdul Haris'), ('user04', 'Yahya Yanuar'), ('user05', 'Sirojul Munir')] sampai disini mestinya cukup mudah untuk dipahami. 3.2.2 Method fetchone()Jika kita hanya ingin mengambil record satu persatu dari data paling awal dapat kita gunakan method fetchone(). Method ini akan mengambil satu record data dari hasil perintah query yang telah dilaksakan oleh method execute().
>>> pointer.execute("select * from customer order by user_id") 5L >>> satu_rec=pointer.fetchone() >>> satu_rec ('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0) Alih-alih menghasilkan semua record, method ini hanya menghasilkan satu record data dimana posisi pointer berada. Dapat dilihat data yang didapatkan berupa sebuah tuple, dimana elemen-elemennya adalah field-field record yang bersangkutan. Jika method fetchone() ini kita jalankan kembali, data yang kita dapatkan adalah data kedua dari hasil query.
>>> satu_rec=pointer.fetchone() >>> satu_rec ('user02', 'Salman AS', '7491a5a745', '2001-04-11', 4500.0) 3.2.3 Method fetchmany()Method lain yang disediakan oleh MySQLdb, sesuai yang dipersyaratkan oleh Python Database API Specification 2.0, adalah fetchmany(). Dengan method ini memungkinkan kita mengambil beberapa data dengan sekali perintah. Boleh kita sebut sebagai method alternatif dari dua method yang ekstrim yaitu, satu record dan semua record.
>>> pointer.execute("select * from customer order by user_id") 5L >>> satu_rec=pointer.fetchmany(3) >>> satu_rec [('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0), ('user02', 'Salman AS', '7491a5a745', '2001-04-11', 4500.0), ('user03', 'Abdul Haris', '7491a38445', '2001-04-12', 5000.0)] Dari lima data yang dihasilkan oleh method execute() hanya diambil tiga data saja. Bilangan ini diberikan sebagai argument untuk method fetchmany(). Method ini akan berusaha memenuhi permintaan kita, mengembalikan data sebanyak yang kita perintahkan kepadanya. Akan tetapi jika jumlah yang kita perintahkan lebih besar dari jumlah record yang ada, maka yang ia akan memberikan seluruh data dari tabel. Dan apabila tidak ada lagi record yang bisa diambil maka method ini akan mengembalikan sebuah array kosong. Pandang set data dalam kasus kita ini, setelah diambil tiga record sebelumnya.
>>> satu_rec=pointer.fetchmany(5) >>> satu_rec [('user04', 'Yahya Yanuar', '7491a1e545', '2001-04-13', 4500.0), ('user05', 'Sirojul Munir', '7491afc245', '2001-04-13', 5000.0)] >>> satu_rec=pointer.fetchmany(5) >>> satu_rec [] Pada fetchmany() pertama, kita akan mengambil 5 record dari hasil query, tapi karena hanya ada dua record saja yang tersisa maka dua record inilah yang diberikan. Sedangkan fetcmany() yang kedua menghasilkan array kosong karena memang sudah tidak ada lagi data bisa diambil. 3.2.4 CatatanSebenarnya secara internal data yang sudah di baca, baik dengan method fetchall(), fetchmany(), maupun fetchone() tidak dihapus dari variabel penampungnya, dalam hal ini adalah variabel _rows. MySQLdb membuat semacam penunjuk ke tuple hasil query. Penunjuk disimpan dalam variabel _pos.Ketiga method yang telah disebutkan sebelumnya bekerja berdasarkan posisi penunjuk ini. Saat pertama query dilaksanakan penunjuk dipasang pada record pertama dari hasil query. Misalnya kita jalankan method fetchone(), maka proses sebenarnya adalah kita membaca record pertama dari variabe penampung. Setelah record dibaca, penunjuk akan dipindahkan satu record ke bawah. Jadi recordnya sendiri tidak dihapus, hanya penunjuknya saja yang dipindahkan. Untuk lebih memperjelas topik ini perhatikan baris perintah berikut,
>>> pointer.execute("select * from customer order by user_id") 5L >>> pointer._rows [('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0), ('user02', 'Salman AS', '7491a5a745', '2001-04-11', 4500.0), ('user03', 'Abdul Haris', '7491a38445', '2001-04-12', 5000.0), ('user04', 'Yahya Yanuar', '7491a1e545', '2001-04-13', 4500.0), ('user05', 'Sirojul Munir', '7491afc245', '2001-04-13', 5000.0)] >>> pointer._pos 0 Bisa diperhatikan bahwa posisi awal pointer adalah 0, atau menunjuk komponen array yang pertama. Misalkan kita menjalankan method fetchone().
>>> satu_rec=pointer.fetchone() >>> satu_rec ('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0) >>> pointer._pos 1 Pada awalnya kita baca record pertama dan disimpan pada variabel satu_rec. Ternyata penunjuk sudah berubah menjadi 1. Sekarang pertanyaannya apakah variabel _rows berubah/datanya berkurang?
>>> pointer._rows [('user01', 'Henry S.', '7491a64645', '2001-04-10', 5000.0), ('user02', 'Salman AS', '7491a5a745', '2001-04-11', 4500.0), ('user03', 'Abdul Haris', '7491a38445', '2001-04-12', 5000.0), ('user04', 'Yahya Yanuar', '7491a1e545', '2001-04-13', 4500.0), ('user05', 'Sirojul Munir', '7491afc245', '2001-04-13', 5000.0)] Ternyata tidak! Fitur-fitur yang menarik yang disediakan oleh standar Python Database API Specification 2.0 masih banyak yang belum dikupas disini. Misalnya penanganan errornya. Yang harus mendapat perhatian khusus adalah mengapa paket MySQLdb ini agak " aneh" , tidak lain karena dibuat untuk memenuhi standar yang sudah disebutkan. Agar pada akhirnya nanti memudahkan kita jika kita akan mengganti database yang kita gunakan, tentu saja tanpa banyak melakukan perubahan pada program kita. 3.3 Menutup objek koneksi databaseSetelah selesai memanipulasi data dalam database kita harus memutuskan koneksi ke server database yang bersangkutan. MySQLdb menyediakan method close() untuk melakukan ini. Method close() bisa kita akses dari objek cursor atau dari objek koneksi database. Jika penutupan kita lakukan dari objek kursor, berikan perintah berikut
>>> pointer.connection.close() akan tetapi kalau anda menjalankan dari objek koneksinya lakukan dengan perintah seperti ini,
>>> dbconnect.close() Untuk membuktikan bahwa koneksi sudah diputus bisa kita jalankan perintah seperti ini,
>>> pointer.execute("select * from online") Traceback (innermost last): File "<stdin>", line 1, in ? File "/usr/lib/python1.5/site-packages/MySQLdb.py", line 192, in execute return self._query(query) File "/usr/lib/python1.5/site-packages/MySQLdb.py", line 281, in _query rowcount = self._BaseCursor__do_query(q) File "/usr/lib/python1.5/site-packages/MySQLdb.py", line 236, in __do_query db.query(q) _mysql.OperationalError: (2006, 'MySQL server has gone away') Kedua cara diatas bisa kita pakai salah satu karena objek cursor adalah turunan dari objek koneksi ke database. 4. Referensi
About this document ...Written by Salman AS |
|||
Email : jakarta@jakarta.linux.or.id