Bagaimana jika Anda dapat mengatur objek database Anda (misalnya tabel dan tampilan) di ruang nama sesuai dengan perannya dalam sistem?
Dalam artikel ini kita akan melihat cara yang tepat untuk menangani dengan skema PostgreSQL di Django dan beberapa tip kecil tentang Model Django dan Python.
Skema
Juga dikenal sebagai namespace, skema adalah jenis objek database yang tujuannya adalah untuk menjadi lapisan organisasi hierarkis yang berada tepat di bawah database.
Di PostgreSQL, "publik" adalah skema default, tetapi Anda dapat membuatnya sendiri ruang nama untuk mengatur objek lain seperti tabel, tampilan, fungsi, dan lain-lain.
Hirarki Objek Basis Data
- Server |- PostgreSQL Instance (Port 5432 by default) |- Role (Users and Groups) |- Tablespace |- Database |- Trigger |- Extension |- Language |- Schema |- Table |- View |- Materialized View |- Sequence |- Function |- Procedure
Tentang Lab kami
Itu adalah lab sederhana dengan Django di lingkungan virtual (dengan virtualenv) dan PostgreSQL terinstal di localhost.
- Python 3.8
- Django 3.0
- PostgreSQL 12
Harus bekerja dengan banyak versi lama
Kode
- > SQL (psql);
- $ shell (Linux, FreeBSD, Unix*);
- >>> Cangkang Python.
Latihan
-
PostgreSQL
Struktur database adalah hal pertama yang akan kita lakukan.
- Pembuatan database user untuk aplikasi;
- Pembuatan basis data;
- Pembuatan skema;
- Pembuatan tabel
Mari kita buat contoh kita sendiri di alat baris perintah bawaan psql:
$ psql
Pembuatan aplikasi pengguna:
CREATE ROLE user_test ENCRYPTED PASSWORD '123' LOGIN;
Peran database dibuat dengan kata sandi terenkripsi dan atribut login (pengguna).
Pembuatan database untuk pengujian:
> CREATE DATABASE db_test OWNER user_test;
Basis data dimiliki oleh “user_test”.
Hubungkan sebagai pengguna “user_test”:
> \c db_test user_test
Di dalam psql shell \c database username.
Pembuatan skema:
> CREATE SCHEMA ns_hr;
Namespace untuk contoh kita sudah siap!
Tampilkan semua skema yang bukan katalog:
> SELECT nspname AS namespace FROM pg_catalog.pg_namespace WHERE nspname !~ '(^pg_|information_schema)';
Keluaran:
namespace ----------- public ns_hr
Perhatikan bahwa muncul namespace default (publik) dan ns_hr, yang dibuat untuk lab kami.
Pembuatan tabel dalam skema ns_hr:
> CREATE TABLE ns_hr.tb_person( id_ serial primary key, name text not null, surname text not null );
Tabel sederhana…
Tekan <Ctrl> + D
untuk keluar.
-
Django
Saatnya membuat kode dengan Python!
- Lingkungan maya;
- Pemasangan modul Python;
- Pembuatan dan konfigurasi proyek Django;
- Pembuatan aplikasi Django;
- Pembuatan model Django;
- Migrasi;
- Tes di shell;
Pembuatan lingkungan virtual:
$ virtualenv -p `which python3.8` django
Jalur absolut biner Python 3.8 diindikasikan sebagai interpreter Python dari lingkungan ini.
Akses direktori lingkungan dan aktifkan:
$ cd django && source bin/activate
Prompt Anda berubah, dimulai pada “(django)” yang menunjukkan bahwa lingkungan virtual Anda telah diaktifkan.
Instal modul kebutuhan untuk pengujian kami:
$ pip install django psycopg2-binary configobj ipython
Masing-masing:Kerangka web Django, driver PostgreSQL, pembaca file konfigurasi, dan shell interaktif yang ditingkatkan.
Pembuatan proyek Django baru:
$ django-admin startproject my_project
Ganti nama direktori proyek menjadi src:
$ mv my_project src
Ini untuk memudahkan hierarki direktori dan tidak akan mempengaruhi hasil. Itu karena itu memiliki direktori nama yang sama yang dapat menyebabkan kebingungan…
Pembuatan file konfigurasi database:
$ cat << EOF > src/my_project/db.conf DB_HOST = 'localhost' DB_NAME = 'db_test' DB_USER = 'user_test' DB_PASSWORD = '123' DB_PORT = 5432 EOF
Di sini kita membuat file konfigurasi terpisah untuk koneksi database.
Edit file konfigurasi utama proyek:
$ vim src/my_project/settings.py
import os from configobj import ConfigObj
Di bawah impor tambahkan baris yang membawa kelas ConfigObj.
# Database # https://docs.djangoproject.com/en/2.2/ref/settings/#databases # Database configuration file location DB_CONF_FILE = f'{BASE_DIR}/my_project/db.conf' # Read the configurations from file DB_CONFIG = ConfigObj(DB_CONF_FILE) # Database connection parameters DB_HOST = DB_CONFIG['DB_HOST'] DB_NAME = DB_CONFIG['DB_NAME'] DB_USER = DB_CONFIG['DB_USER'] DB_PASSWORD = DB_CONFIG['DB_PASSWORD'] DB_PORT = DB_CONFIG['DB_PORT'] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': DB_NAME, 'USER': DB_USER, 'PASSWORD': DB_PASSWORD, 'HOST': DB_HOST, 'PORT': DB_PORT, } }
Ubah “sesi” database seperti di atas.
Pembuatan tautan simbolis untuk manage.py:
$ ln -s `pwd`/src/manage.py `pwd`/bin/manage.py
Untuk memudahkan pekerjaan kami, kami membuat tautan simbolis ke manage.py di direktori bin yang ada di $PATH kami.
Jalankan server web virtual:
$ manage.py runserver 0.0.0.0:8000
Uji di browser Anda:http://localhost:8000 lalu
Akses direktori proyek:
$ cd src
Mari kita periksa file di dalam direktori saat ini:
$ tree .
Keluaran:
. ├── manage.py └── my_project ├── db.conf ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-38.pyc │ ├── settings.cpython-38.pyc │ ├── urls.cpython-38.pyc │ └── wsgi.cpython-38.pyc ├── settings.py ├── urls.py └── wsgi.py
Daftar isi direktori saat ini dalam format seperti pohon.
Di sini kita melihat semua file di dalam proyek.
Migrasi pertama untuk metadata Django:
$ manage.py migrate
Pembuatan pengguna super Django:
$ manage.py createsuperuser
Buat aplikasi:
$ manage.py startapp human_resource
Edit settings.py untuk menambahkan aplikasi baru:
$ vim my_project/settings.py
# Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', # Custom Apps 'human_resource', ]
Trik Django yang keren:Anda dapat menggunakan model direktori sebagai ganti file models.py.
Tetapi Anda harus membuat file init dunder (__init__.py) di dalam direktori model.
Ayo!
Pembuatan direktori model di dalam direktori aplikasi:
$ mkdir human_resource/models
Hapus file models.py:
$ rm -f human_resource/models.py
Pembuatan model:
$ vim human_resource/models/hr.py
from django.db.models import AutoField from django.db.models import Model from django.db.models import TextField class Person(Model): ''' Person Model Namespace: ns_hr Table: tb_person ''' id_ = AutoField(db_column='id_', name='id', primary_key=True,) name = TextField(db_column='name', name='name',) surname = TextField(db_column='surname', name='surname',) def __str__(self): return f'{self.name} {self.surname}' class Meta: db_table = 'ns_hr"."tb_person' # 'schema"."object' verbose_name_plural = 'Person'
Untuk menikmati manfaat skema PostgreSQL, di dalam model Anda, di kelas dalam Meta, ke nilai atribut “db_table” Anda harus meletakkan titik yang memisahkan namespace dan objek di antara tanda kutip.
'schema"."object'
Objeknya bisa berupa tabel atau tampilan, misalnya…
Dunder init di dalam direktori model agar migrasi berlaku:
vim human_resource/models/__init__.py
from human_resource.models.hr import Person
Ini diperlukan agar direktori model berfungsi sebagai file models.py.
(Tidak) Migrasi:Basis Data Saya, Aturan Saya!
Kami membuat struktur database kami dan tidak ada ORM yang melakukannya untuk kami!
Kami memiliki kekuatan!
Kami memiliki kekuatan!
Kami memegang komando!
Basis data kami, aturan kami!
Cukup buat model database Anda dengan tangan Anda sendiri dan buat migrasi Django palsu.
Karena hanya kita yang tahu bagaimana objek database harus dibuat
Lakukan migrasi untuk aplikasi human_resource:
$ manage.py makemigrations human_resource
Migrasi palsu:
$ manage.py migrate --fake
Mari kita periksa hierarki direktori aplikasi:
$ tree human_resource/
human_resource/ ├── admin.py ├── apps.py ├── __init__.py ├── migrations │ ├── 0001_initial.py │ ├── __init__.py │ └── __pycache__ │ ├── 0001_initial.cpython-38.pyc │ └── __init__.cpython-38.pyc ├── models │ ├── hr.py │ ├── __init__.py │ └── __pycache__ │ ├── hr.cpython-38.pyc │ └── __init__.cpython-38.pyc ├── __pycache__ │ ├── admin.cpython-38.pyc │ └── __init__.cpython-38.pyc ├── tests.py └── views.py
Django Shell (Ipython):
$ manage.py shell
>>> from human_resource.models.hr import Person >>> p = Person(name='Ludwig', surname='van Beethoven') >>> print(p)
Keluaran:
Ludwig van Beethoven
>>> p.save() # Persist in database
Tekan <Ctrl> + D
untuk keluar!
Cangkang basis data (psql):
$ manage.py dbshell
Sebuah query untuk memeriksa apakah data telah disisipkan oleh Django:
> SELECT id_, name, surname FROM ns_hr.tb_person;
Keluaran:
id | name | surname ----+--------+--------------- 1 | Ludwig | van Beethoven
Kesimpulan
PostgreSQL adalah RDBMS yang kuat dan kuat dengan banyak fitur, termasuk ruang nama untuk objeknya.
Django adalah kerangka kerja web hebat yang sangat kuat dan memiliki banyak fitur juga.
Jadi, Anda bisa mengekstrak yang lebih baik dari keduanya untuk mencapai hasil yang lebih baik dan untuk melakukan ini, salah satu caranya adalah mendapatkan organisasi yang lebih baik.
Mengatur objek database Anda di ruang nama sesuai dengan perannya akan membawa manfaat bagi Anda 😉