PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Lược đồ PostgreSQL / Không gian tên với Django

Còn nếu bạn có thể tổ chức các đối tượng cơ sở dữ liệu của mình (ví dụ:bảng và dạng xem) trong không gian tên theo vai trò của nó trong hệ thống thì sao?
Trong bài viết này, chúng ta sẽ thấy cách phù hợp để xử lý với các lược đồ PostgreSQL trong Django và một số mẹo nhỏ về Các mô hình Django và Python.

Lược đồ

Còn được gọi là không gian tên, lược đồ là một loại đối tượng cơ sở dữ liệu có mục đích là lớp tổ chức phân cấp nằm ngay bên dưới cơ sở dữ liệu.
Trên PostgreSQL, “public” là lược đồ mặc định, nhưng bạn có thể tạo lược đồ của riêng mình. không gian tên để tổ chức các đối tượng khác như bảng, dạng xem, chức năng, v.v.

Phân cấp đối tượng cơ sở dữ liệu

- Server
   |- PostgreSQL Instance (Port 5432 by default)
       |- Role (Users and Groups)
       |- Tablespace
       |- Database
           |- Trigger
           |- Extension
           |- Language
           |- Schema      
               |- Table
               |- View
               |- Materialized View
               |- Sequence
               |- Function
               |- Procedure

Giới thiệu về Phòng thí nghiệm của chúng tôi

Đó là một phòng thí nghiệm đơn giản với Django trong môi trường ảo (với virtualenv) và PostgreSQL được cài đặt trong localhost.

  • Python 3.8
  • Django 3.0
  • PostgreSQL 12

Nên hoạt động với nhiều phiên bản cũ hơn 🙂

  • > SQL (psql);
  • $ shell (Linux, FreeBSD, Unix *);
  • >>> Vỏ Python.

Thực hành

  • PostgreSQL

Kết cấu cơ sở dữ liệu là điều đầu tiên chúng tôi sẽ làm.

  • Tạo người dùng cơ sở dữ liệu cho ứng dụng;
  • Tạo cơ sở dữ liệu;
  • Tạo lược đồ;
  • Tạo bảng

Hãy tạo ví dụ của riêng chúng ta trong công cụ dòng lệnh tích hợp psql:

$ psql

Tạo ứng dụng người dùng:

CREATE ROLE user_test ENCRYPTED PASSWORD '123' LOGIN;

Vai trò cơ sở dữ liệu được tạo bằng thuộc tính đăng nhập và mật khẩu được mã hóa (người dùng).

Tạo cơ sở dữ liệu cho các bài kiểm tra:

> CREATE DATABASE db_test OWNER user_test;

Cơ sở dữ liệu thuộc sở hữu của “user_test”.

Kết nối với nó với tư cách người dùng “user_test”:

> \c db_test user_test

Bên trong tên người dùng cơ sở dữ liệu psql shell \ c.

Tạo giản đồ:

> CREATE SCHEMA ns_hr;

Không gian tên cho ví dụ của chúng tôi đã sẵn sàng!

Hiển thị tất cả các lược đồ không phải là danh mục:

> SELECT
nspname AS namespace
FROM pg_catalog.pg_namespace
WHERE nspname !~ '(^pg_|information_schema)';

Đầu ra:

namespace 
-----------
 public
 ns_hr

Lưu ý rằng sẽ xuất hiện không gian tên mặc định (công khai) và ns_hr, được tạo cho phòng thí nghiệm của chúng tôi.

Tạo bảng trong lược đồ ns_hr:

> CREATE TABLE ns_hr.tb_person(
    id_ serial primary key,
    name text not null,
    surname text not null
);

Một bảng đơn giản…

Nhấn <Ctrl> + D để thoát.

  • Django

Đã đến lúc viết mã bằng Python! 😀

  • Môi trường ảo;
  • Cài đặt mô-đun Python;
  • Tạo và cấu hình dự án Django;
  • Tạo ứng dụng Django;
  • Tạo mô hình Django;
  • Di chuyển;
  • Kiểm tra trong shell;

Tạo môi trường ảo:

$ virtualenv -p `which python3.8` django

Đường dẫn tuyệt đối của tệp nhị phân của Python 3.8 được chỉ ra là trình thông dịch Python của môi trường này.

Truy cập thư mục môi trường và kích hoạt nó:

$ cd django && source bin/activate

Lời nhắc của bạn đã thay đổi, bắt đầu ở “(django)” cho biết rằng môi trường ảo của bạn đã được kích hoạt.

Cài đặt các mô-đun cần thiết cho các thử nghiệm của chúng tôi:

$ pip install django psycopg2-binary configobj ipython

Khả năng đáp ứng:Khung web Django, trình điều khiển PostgreSQL, trình đọc tệp cấu hình và trình bao tương tác được cải thiện.

Tạo dự án Django mới:

$ django-admin startproject my_project

Đổi tên thư mục của dự án thành src:

$ mv my_project src

Điều này là để dễ phân cấp thư mục và sẽ không ảnh hưởng đến kết quả. Đó là vì thư mục có cùng tên có thể gây ra một số nhầm lẫn…

Tạo tệp cấu hình cơ sở dữ liệu:

$ 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

Ở đây, chúng tôi đã tạo một tệp cấu hình riêng biệt cho kết nối cơ sở dữ liệu.

Chỉnh sửa tệp cấu hình chính của dự án:

$ vim src/my_project/settings.py

import os

from configobj import ConfigObj

Bên dưới các mục nhập, thêm một dòng mang đến lớp 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,
                         }
            }

Sửa đổi “phiên” cơ sở dữ liệu như trên.

Tạo liên kết tượng trưng cho management.py:

$ ln -s `pwd`/src/manage.py `pwd`/bin/manage.py

Để dễ dàng thực hiện công việc của mình, chúng tôi đã tạo một liên kết tượng trưng đến management.py trong thư mục bin nằm trong $ PATH của chúng tôi.

Chạy máy chủ web ảo:

$ manage.py runserver 0.0.0.0:8000

Kiểm tra trong trình duyệt của bạn:http:// localhost:8000 và sau đó + C để hủy bỏ.

Truy cập thư mục dự án:

$ cd src

Hãy kiểm tra các tệp bên trong thư mục hiện tại:

$ tree .

Đầu ra:

.
├── 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

Liệt kê nội dung của thư mục hiện tại ở định dạng giống cây.
Tại đây, chúng tôi thấy tất cả các tệp bên trong dự án.

Lần di chuyển đầu tiên cho siêu dữ liệu Django:

$ manage.py migrate

Tạo ra siêu người dùng Django:

$ manage.py createsuperuser

Tạo ứng dụng:

$ manage.py startapp human_resource

Chỉnh sửa settings.py để thêm ứng dụng mới:

$ 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',
]

Một thủ thuật Django thú vị:bạn có thể sử dụng các mô hình thư mục thay vì tệp models.py.
Nhưng bạn phải tạo tệp init dunder (__init__.py) bên trong thư mục mô hình.
Hãy bắt đầu!

Tạo thư mục mô hình bên trong thư mục ứng dụng:

$ mkdir human_resource/models

Xóa tệp models.py:

$ rm -f human_resource/models.py

Tạo mô hình:

$ 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'

Để tận hưởng những lợi ích của lược đồ PostgreSQL, bên trong mô hình của bạn, trong lớp bên trong Meta, với giá trị của thuộc tính “db_table”, bạn phải đặt một dấu chấm phân tách không gian tên và đối tượng giữa dấu ngoặc kép.

'schema"."object'

Đối tượng có thể là một bảng hoặc một khung nhìn, chẳng hạn…

Dunder init bên trong thư mục mô hình để quá trình di chuyển có hiệu lực:

vim human_resource/models/__init__.py
from human_resource.models.hr import Person

Điều này là cần thiết để thư mục mô hình hoạt động dưới dạng tệp models.py.

(Không) Di chuyển:Cơ sở dữ liệu của tôi, Quy tắc của tôi!

Chúng tôi tạo ra cấu trúc cơ sở dữ liệu của mình và không ORM nào phải làm điều đó cho chúng tôi!
Chúng tôi có quyền lực!
Chúng tôi có sức mạnh!
Chúng tôi chỉ huy!

Cơ sở dữ liệu của chúng tôi, các quy tắc của chúng tôi! 😉

Chỉ cần tự tay bạn lập mô hình cơ sở dữ liệu và thực hiện di chuyển Django giả.
Bởi vì chỉ có chúng tôi mới biết cách các đối tượng cơ sở dữ liệu phải được tạo ra 😉

Thực hiện di chuyển cho ứng dụng human_resource:

$ manage.py makemigrations human_resource

Di chuyển giả mạo:

$ manage.py migrate --fake

Hãy kiểm tra thứ bậc thư mục của ứng dụng:

$ 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)

Đầu ra:

Ludwig van Beethoven
>>> p.save()   # Persist in database

Nhấn <Ctrl> + D để thoát!

Vỏ cơ sở dữ liệu (psql):

$ manage.py dbshell

Một truy vấn để kiểm tra xem dữ liệu đã được chèn bởi Django hay chưa:

>  SELECT id_, name, surname FROM ns_hr.tb_person;

Đầu ra:

id
 id |  name  |    surname    
----+--------+---------------
  1 | Ludwig | van Beethoven

Kết luận

PostgreSQL là một RDBMS mạnh mẽ và mạnh mẽ với rất nhiều tính năng, bao gồm không gian tên cho các đối tượng của nó.
Django là một khung công tác web tuyệt vời, rất mạnh mẽ và cũng có rất nhiều tính năng.
Vì vậy, bạn có thể trích xuất cái tốt hơn của cả hai để đạt được kết quả tốt hơn và để làm điều này, một trong những cách là tổ chức tốt hơn.
Tổ chức các đối tượng cơ sở dữ liệu của bạn trong không gian tên theo đúng vai trò của nó sẽ mang lại lợi ích cho bạn 😉


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PGTune Alternatives - ClusterControl PostgreSQL Configuration

  2. Cách nối chuỗi trong PostgreSQL

  3. Trả về giá trị cột trước UPDATE chỉ bằng SQL

  4. Công thức hệ số tương quan Pearson trong SQL

  5. Lưu trữ hình ảnh trong PostgreSQL