Menggunakan Legacy Database dalam Django

  • [Panduan Memulai Belajar Django][1]
  • [Perbedaan App dan Project pada Django][2]

Pada kesempatan sebelumnya saya sudah membahas tentang seluk beluk Django sebagai perkenalan untuk proses belajar di [Sinau Development][3] dan buku yang saya sedang kerjakan [Panduan Memulai Belajar Django][4]. Materi tersebut masih belum berlanjut dikarenakan beberapa hambatan terutama masalah waktu. Kita akan coba untuk melompat materi mengenai Database untuk Django.

Dalam Django, kita bisa melakukan perancangan database dengan menggunakan models object atau pun langsung. Apa yang akan saya bahas kali ini adalah point kedua, dimana kita akan menggunakan existing database sebagai models untuk nantinya django bertransaksi data. Tentunya kita harus membuat django project terlebih dahulu:

$ django-admin startproject latihan

Bila sudah terbuat project maka akan seperti berikut:

$ tree latihan
latihan
|-- latihan
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
`-- manage.py

1 directory, 5 files

Kita akan memakai default database scheme dari Django itu sendiri, tapi bisa juga menggunakan database yang lain. Agar lebih memudahkan dalam tulisan kali ini, maka akan menggunakan default database scheme dari django dan menambahkan beberapa table tambahan. Masuk kedalam direktori lalu lakukan migrasi database:

cd latihan && python manage.py migrate

Maka akan menampilkan hasil seperti berikut:

$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying sessions.0001_initial... OK

Dengan sendiri tercipta sebuah berkas database yang menggunakan SQLite3

$ tree latihan/
latihan/
|-- db.sqlite3
|-- latihan
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   `-- wsgi.py
`-- manage.py

Saya menggunakan DB Browser for SQLite [http://sqlitebrowser.org/] untuk manage database SQLite3. Dan bila kita membuka database yang sudah terbuat maka struktur database nya akan terlihat seperti berikut:

Default Database Scheme Django
Default Database Scheme Django

Sebagai contoh table, kita tambahkan table dengan Query ataupun dengan import SQL file bila ada seperti berikut:

CREATE TABLE `latihan` (
	`id`	INTEGER PRIMARY KEY AUTOINCREMENT,
	`nama`	TEXT,
	`alamat`	TEXT
);

Jangan lupa disave yak. Write Changes( ctrl + s )

Ok, bila sudah berhasil maka akan muncul 1 table baru. Oh iya kalau database nya berbeda, harus diatur terlebih dahulu di file settings.py bagian:

# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Mulai membuat models database kita dengan menggunakan fitur inspectdb di django:

$ python manage.py inspectdb > latihan/models.py

Nah, kalau ga ada error, nanti akan terbuat file baru bernama models.py di direktori latihan dengan isi sebagai berikut:

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from __future__ import unicode_literals

from django.db import models


class AuthGroup(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    name = models.CharField(unique=True, max_length=80)

    class Meta:
        managed = False
        db_table = 'auth_group'


class AuthGroupPermissions(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    group = models.ForeignKey(AuthGroup, models.DO_NOTHING)
    permission = models.ForeignKey('AuthPermission', models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_group_permissions'
        unique_together = (('group', 'permission'),)


class AuthPermission(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING)
    codename = models.CharField(max_length=100)
    name = models.CharField(max_length=255)

    class Meta:
        managed = False
        db_table = 'auth_permission'
        unique_together = (('content_type', 'codename'),)


class AuthUser(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField(blank=True, null=True)
    is_superuser = models.BooleanField()
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.CharField(max_length=254)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()
    username = models.CharField(unique=True, max_length=150)

    class Meta:
        managed = False
        db_table = 'auth_user'


class AuthUserGroups(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    group = models.ForeignKey(AuthGroup, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_user_groups'
        unique_together = (('user', 'group'),)


class AuthUserUserPermissions(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    permission = models.ForeignKey(AuthPermission, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_user_user_permissions'
        unique_together = (('user', 'permission'),)


class DjangoAdminLog(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    object_id = models.TextField(blank=True, null=True)
    object_repr = models.CharField(max_length=200)
    action_flag = models.PositiveSmallIntegerField()
    change_message = models.TextField()
    content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING, blank=True, null=True)
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    action_time = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_admin_log'


class DjangoContentType(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    app_label = models.CharField(max_length=100)
    model = models.CharField(max_length=100)

    class Meta:
        managed = False
        db_table = 'django_content_type'
        unique_together = (('app_label', 'model'),)


class DjangoMigrations(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    app = models.CharField(max_length=255)
    name = models.CharField(max_length=255)
    applied = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_migrations'


class DjangoSession(models.Model):
    session_key = models.CharField(primary_key=True, max_length=40)
    session_data = models.TextField()
    expire_date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_session'


class Latihan(models.Model):
    id = models.IntegerField(blank=True, null=True)
    nama = models.TextField(blank=True, null=True)
    alamat = models.TextField(blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'latihan'

Karena id merupakan primary_key, maka kita perlu merubahnya menjadi:

id = models.IntegerField(primary_key=True)

Model yang kita inginkan sudah terbuat. Kita akan coba pakai model tersebut untuk menampilkan data dari database, sebelumnya tambahkan beberapa data dummy di table latihan yang sudah terbuat.

INSERT INTO `latihan`(`id`,`nama`,`alamat`) VALUES (NULL,'Budi','Jakarta');
INSERT INTO `latihan`(`id`,`nama`,`alamat`) VALUES (NULL,'Bella','Bandung');
INSERT INTO `latihan`(`id`,`nama`,`alamat`) VALUES (NULL,'Bena','Bogor');

Buat sebuah file baru bernama views.py didirektori yang sama dengan models.py:

from django.http import HttpResponse, HttpResponseRedirect, Http404
from django.shortcuts import render_to_response, get_object_or_404

from models import Latihan

def views_latihan(request):
    latihan_list = Latihan.objects.all().order_by('id')
    return render_to_response('index.html', {'latihan_data': latihan_list})

Kita perlu membuat templates terlebih dahulu, buat direktori `templates` dengan file `index.html` seperti berikut:

{% for data in latihan_data %}
      {{ data.id }}
      {{ data.nama }}
      {{ data.alamat }}
	<hr/>
{% endfor %}

Tahap selanjutnya kita buat url routing di urls.py agar views dan models yang kita buat bisa dipanggil lewat URL yang diinginkan. Ubah file urls.py menjadi seperti berikut:

from django.conf.urls import url
from django.contrib import admin

from views import views_latihan

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^$', views_latihan),
]

Daftarkan Latihan sebagai installed app didalam settings.py:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'latihan',
]

Bila semua sudah selesai, jalankan django webserver:

$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
June 10, 2017 - 06:06:46
Django version 1.11.2, using settings 'latihan.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

Tadaaaaa, models dari legacy database kita sudah berhasil terbuat:

 

Mungkin itu saja yang bisa saya bahas pada tulisan kali ini. Semoga artikel ini bermanfaat. Koreksi bila ada kesalahan 🙂

Share this awesome article to the world, so everyone knows it :)

LinkedIn
Reddit
WhatsApp
Hacker News
Telegram