PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Skema PostgreSQL / Ruang Nama dengan Django

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 + C untuk membatalkan.

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 😉


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara mendapatkan teks SQL dari pemicu acara Postgres

  2. hilangkan nilai array duplikat di postgres

  3. Bagaimana cara memasukkan catatan yang dapat diperbarui dengan kolom JSON di PostgreSQL menggunakan JOOQ?

  4. Apakah Postgres mendukung transaksi bersarang atau otonom?

  5. Memulai Dengan Postgres 13 di Ubuntu 20.04