Monday, November 17, 2014

Membuat ORM Dengan Python

Apa itu ORM ? Hasil googling di index pertama dengan 'keyword' yang sama dengan pertanyaan barusan menurut artikel di javan.co.id, ORM adalah sebagai berikut :
"ORM merupakan kependekan dari Object Relational Mapping, sebuah teknik pemrograman yang memetakan sebuah objek dengan database. ORM ini akan membantu menjadi ‘jembatan’ antara objek yang didefinisikan dalam kode program dengan database, bagaimana objek itu disimpan, diambil, dihapus dan sebagainya. Dengan ORM ini, programmer dibantu untuk melakukan aksi-aksi yang diperlukan terkait komunikasi objek ketika program dijalankan dengan database seperti menyimpan objek, mengambil data objek dari database kemudian ditampilkan, menghapus objek, mengubah objek dan sebagainya."
Wow, canggih ya ? saya juga jadi penasaran seperti apa sih ORM itu dan bagaimana membuatnya. Setelah membaca literatur ringan mengenai DOCTRINE (salah satu ORM berbasis PHP yang populer) dan mencoba beberapa ORM yang pernah saya gunakan dan pelajari contohnya adalah ORM yang digunakan Symfony, Django dan ORM yang digunakan oleh App Engine Google, saya mencoba membuat project ORM kecil sebagai percobaan hasil belajar saya tentang ORM yang saya tempatkan di GitHub dengan nama EasyORM. Bila Anda juga berminat untuk mempelajari dan berbagi pengetahuan Anda tentang ORM (dan Python) dengan saya silahkan berkontribusi disini.


ORM ini saya buat menggunakan salah satu bahasa pemrograman favorit saya, Python dan saat ini hanya mendukung database MySQL. Kenapa saya memilih Python ? jelas saja karena saya barusan bilang Python adalah salah satu bahasa pemrograman favorit saya hehehe....

Sudahlah, daripada Anda bingung dengan kalimat saya diatas sebaiknya mari kita mulai saja bagaimana menggunakan ORM ini. Langkah pertama saya rekomendasikan Anda untuk mengunduh kode ORM ini di https://github.com/fargobee/EasyORM

Setelah diekstrak, akan menghasilkan beberapa file antara lain dbconf.py, dbcore.py, easyORM.py dan model.py. Untuk konfigurasi database silahkan edit file dbconf.py, berikut contoh isinya : 
class Dbconf:
    def __init__(self):
        ##DO NOT EDIT THIS INIT
        self.database={}
        self.config()
    def config(self):
        self.database["dbtype"]="mysql"
        self.database["user"]="root"
        self.database["passw"]="root"
        self.database["dbname"]="test"
        self.database["dbhost"]="localhost"
        self.database["port"]=3306

Sebagaimana layaknya ORM, Anda harus membuat 'entity' lebih dahulu yaitu sebuah kelas model, pada hasil unduhan Anda saya sudah menyertakan sebuah file 'entity' yang bernama model.py. Isi file model.py kurang lebih seperti berikut :
import sys 
sys.path.append('path\to\your\EasyORM')
from easyORM import Orm    
class Teman(Orm):
    nama=["str",20,"not null"]
    alamat=["text",50,"null"]
    telpon=["str",15,"not null"]
    umur=["int",3,'null']

Anda familiar dengan format kelas ini ? Ya, saya memang mengadopsi bentuk format model mirip Django dan ORM yang digunakan Google App Engine hanya saja dengan 'gaya' saya.

Dengan model ini kita akan membuat sebuah tabel yang bernama 'Teman' yang berisi field atau property yang bernama 'nama', 'alamat', 'telpon' dan 'umur' dimana tiap property adalah sebuah object bertype data 'list' dengan format yang masih sederhana, yaitu :
propertyname=[datatype(string), datasize(int), null or not null(string)]

Berikut daftar variabel type data yang saya gunakan :
chr:CHAR
str:VARCHAR
ttext:TINYTEXT
text:TEXT
mtext:MEDIUMTEXT
ltext:LONGTEXT
int:INT
tint:TINYINT
sint:SMALLINT
mint:MEDIUMINT
bint:BIGINT
bit:BIT
float:FLOAT
dbl:DOUBLE
dec:DECIMAL
blob:BLOB
date:DATE
time:TIME
year:YEAR
dtime:DATETIME
tstamp:TIMESTAMP
enum:ENUM

Mari kita mulai mencoba di konsol Python

>>> import sys

Karena kita akan menggunakan konsol, mari arahkan path ke folder tempat penyimpanan kelas modelAnda
>>> sys.path.append('path\to\your\model')

Import kelas model atau entity Anda
>>> from model import Teman
>>> teman=Teman()

Berikut hasil dari baris diatas (tabel 'teman' sudah ada di database saya):

Field "nama" data : "['str', 20, 'not null']"
Field "telpon" data : "['str', 15, 'not null']"
Field "alamat" data : "['text', 50, 'null']"
Field "umur" data : "['int', 3, 'null']"

Warning (from warnings module):
  File "path\to\your\easyorm\dbcore.py", line 104
    cursor.execute("""CREATE TABLE IF NOT EXISTS %s (%s);""" % (self.theentity, fl))
Warning: Table 'teman' already exists
Entity "Teman" ready to use

Operasi database yang saat ini ada hanya mendukung operasi "CRUD" standar, sekarang mari kita coba :

Create atau menginput data
>>> teman.Create(nama="KATRO",alamat="JL ASEM BARIS UTARA NO 1",telpon="123456789")
>>> 'Data added !'

Read atau menampilkan record
>>> teman.Read(nama="KATRO") ##tampilkan record yang memiliki nama KATRO
(('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None),)

Tambahkan option 'limit' untuk menentukan jumlah data yang akan ditampilkan:

>>> teman.Read(nama="KATRO", limit=3)
(('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None), ('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None), ('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None))

>>> teman.Read(telpon="123456789") ##tampilkan record yang memiliki no telpon 123456789
(('123456789', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None),)

>>> teman.Read(telpon="1234567", nama='katro', limit=3) ##tampilkan record yang memiliki nama KATRO dan telpon 1234567
(('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', 31L), ('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', 31L), ('1234567', 'KATRO', 'JL ASEM BARIS UTARA NO 1', 31L))

Update atau memperbaharui data
>>> teman.Update(nama="KATRO",alamat="JL ASEM BARIS UTARA NO 1",telpon="1234567",umur=31, search={"telpon":"123456789"}) 

'search' adalah object dengan type data dictionary yang digunakan untuk mencari data yang akan di update contoh diatas kita mengupdate record data yangmemiliki 'telpon' = '123456789'

Atau bisa juga dengan cara berikut :

>>> cari={"telpon":"123456789"}
>>> teman.Update(nama="KATRO",alamat="JL ASEM BARIS UTARA NO 1",telpon="1234567",umur=31, search=cari)

Delete atau menghapus data
>>> teman.Delete(telpon="123456789") ##menghapus record data yangmemiliki 'telpon' = '123456789'
'Data deleted !'

Mengeksekusi Query
>>> teman.execQuery("select * from Teman limit 1")
(('123456789', 'KATRO', 'JL ASEM BARIS UTARA NO 1', None),)

Operasi query diatas juga baru diuji coba menggunakan operasi query CRUD standar.

Bagaimana ? kalo tertarik, silahkan berbagi pengetahuan dengan saya silahkan 'forking' project ini apabila Anda sudah memiliki akun GitHub karena saya yakin banget kode dan fitur yang ada saat ini masih sangat sederhana karena saya juga masih belajar Python jadi harap maklum ya.

No comments: