Hướng dẫn sử dụng PostgreSQL với Django trên Ubuntu 20.04: Cài đặt, cấu hình và tối ưu

Tuyệt vời! Kết hợp Django với PostgreSQL là gì trên Ubuntu là gì 20.04 là một lựa chọn mạnh mẽ để xây dựng các ứng dụng web có khả năng mở rộng và hiệu suất cao. Tuy nhiên, việc cài đặt và cấu hình ban đầu có thể là một thử thách nhỏ nếu bạn chưa quen. Bạn đã bao giờ tự hỏi làm thế nào để hai công nghệ này hoạt động trơn tru cùng nhau chưa?

Bài viết này chính là cẩm nang chi tiết mà bạn cần. Chúng ta sẽ cùng nhau đi qua từng bước, từ việc cài đặt PostgreSQL trên một máy chủ Ubuntu 20.04 sạch, cho đến việc cấu hình dự án Django để kết nối và tương tác với cơ sở dữ liệu. Cuối cùng, bạn sẽ có một nền tảng vững chắc, sẵn sàng để phát triển ứng dụng của mình.

Giới thiệu

Trong thế giới phát triển web hiện đại, việc lựa chọn đúng bộ công cụ công nghệ (tech stack) là yếu tố quyết định đến sự thành công của một dự án. Django là gì, một framework Python bậc cao, nổi tiếng với triết lý “batteries-included”, giúp các nhà phát triển xây dựng ứng dụng nhanh chóng và an toàn. Khi kết hợp với PostgreSQL, một hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở mạnh mẽ và đáng tin cậy, chúng ta có một cặp đôi hoàn hảo cho các ứng dụng đòi hỏi sự ổn định, khả năng mở rộng và tính toàn vẹn dữ liệu cao.

Tuy nhiên, việc kết nối Django với PostgreSQL trên môi trường Ubuntu 20.04 đôi khi có thể gây ra một vài khó khăn cho người mới bắt đầu. Từ việc cài đặt đúng các gói phụ thuộc, cấu hình quyền truy cập cho đến việc thiết lập chính xác chuỗi kết nối trong Django, mỗi bước đều cần sự cẩn thận.

Trong bài viết này, chúng ta sẽ đi qua một lộ trình rõ ràng. Đầu tiên, chúng ta sẽ cài đặt và cấu hình PostgreSQL trên Ubuntu. Tiếp theo, chúng ta sẽ thiết lập một dự án Django và kết nối nó với cơ sở dữ liệu vừa tạo. Sau đó, chúng ta sẽ xây dựng một ứng dụng nhỏ để kiểm tra sự tương tác. Cuối cùng, bài viết sẽ đề cập đến các lỗi thường gặp, cách tối ưu hiệu suất và các biện pháp bảo mật quan trọng.

Lợi ích của việc sử dụng PostgreSQL làm cơ sở dữ liệu cho Django là không thể phủ nhận. Bạn sẽ được hưởng lợi từ các tính năng nâng cao như hỗ trợ kiểu dữ liệu JSON, full-text search, và các ràng buộc toàn vẹn phức tạp, giúp ứng dụng của bạn trở nên mạnh mẽ và linh hoạt hơn bao giờ hết.

Cài đặt PostgreSQL trên Ubuntu 20.04

Để bắt đầu, chúng ta cần chuẩn bị “nền móng” cho ứng dụng của mình, đó chính là cơ sở dữ liệu PostgreSQL. Việc cài đặt trên Ubuntu 20.04 khá đơn giản nếu bạn làm theo đúng các bước. Hãy cùng bắt đầu nhé.

Cập nhật hệ thống và cài đặt PostgreSQL

Trước khi cài đặt bất kỳ phần mềm mới nào, việc đầu tiên và quan trọng nhất là cập nhật danh sách gói của hệ thống. Điều này đảm bảo rằng bạn sẽ cài đặt được phiên bản mới nhất và an toàn nhất.

Mở terminal của bạn và chạy lệnh sau:

sudo apt update && sudo apt upgrade

Sau khi hệ thống đã được cập nhật, hãy tiến hành cài đặt PostgreSQL và gói postgresql-contrib, gói này cung cấp thêm nhiều tiện ích hữu ích.

sudo apt install postgresql postgresql-contrib

Quá trình cài đặt sẽ diễn ra tự động. Sau khi hoàn tất, dịch vụ PostgreSQL sẽ tự động khởi chạy. Để chắc chắn mọi thứ đều ổn, bạn có thể kiểm tra trạng thái của dịch vụ bằng lệnh:

sudo systemctl status postgresql

Nếu bạn thấy dòng chữ active (running) màu xanh lá, xin chúc mừng! Bạn đã cài đặt thành công PostgreSQL.

Hình minh họa

Tạo và quản lý cơ sở dữ liệu PostgreSQL

Bây giờ, chúng ta cần tạo một cơ sở dữ liệu và một người dùng riêng cho ứng dụng Django của mình. Đây là một thực hành bảo mật tốt, giúp cô lập quyền truy cập và quản lý ứng dụng dễ dàng hơn.

PostgreSQL tạo ra một người dùng hệ thống tên là postgres trong quá trình cài đặt. Chúng ta cần chuyển sang người dùng này để thực hiện các tác vụ quản trị.

sudo -i -u postgres

Bây giờ bạn đang ở trong quyền của người dùng postgres. Hãy truy cập vào giao diện dòng lệnh của PostgreSQL, còn được gọi là psql.

psql

Bên trong psql, bạn có thể thực thi các câu lệnh SQL là gì. Hãy tạo một cơ sở dữ liệu mới cho dự án. Ví dụ, chúng ta sẽ đặt tên là myprojectdb.

CREATE DATABASE myprojectdb;

Tiếp theo, tạo một người dùng mới. Hãy chọn một tên người dùng và một mật khẩu mạnh.

CREATE USER myprojectuser WITH PASSWORD 'your_strong_password';

Bây_giờ, chúng ta cần cấp cho người dùng myprojectuser toàn bộ quyền trên cơ sở dữ liệu myprojectdb.

GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;

Để đảm bảo các thiết lập này được áp dụng đúng cách cho dự án Django sau này, hãy thay đổi một vài thông số cho người dùng của chúng ta.

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';

Những lệnh này đảm bảo rằng kết nối từ Django sẽ sử dụng mã hóa UTF-8, mức độ cô lập giao dịch phù hợp và múi giờ UTC, đây là những thiết lập tiêu chuẩn cho các ứng dụng web.

Cuối cùng, thoát khỏi psql bằng lệnh \q và thoát khỏi người dùng postgres bằng lệnh exit.

Hình minh họa

Cài đặt và cấu hình Django để kết nối với PostgreSQL

Khi cơ sở dữ liệu đã sẵn sàng, bước tiếp theo là xây dựng “ngôi nhà” Django là gì và kết nối nó với “nền móng” PostgreSQL mà chúng ta vừa tạo. Quá trình này bao gồm việc thiết lập môi trường, cài đặt các thư viện cần thiết và cấu hình dự án.

Thiết lập môi trường Django và cài đặt phụ thuộc

Làm việc trong một môi trường ảo (virtual environment) là một thực hành tốt nhất trong phát triển Python là gì. Nó giúp cô lập các gói phụ thuộc của dự án, tránh xung đột với các dự án khác trên cùng một máy.

Đầu tiên, hãy cài đặt công cụ để tạo môi trường ảo:

sudo apt install python3-venv

Bây giờ, hãy tạo một thư mục cho dự án của bạn và di chuyển vào đó.

mkdir myproject
cd myproject

Tạo một môi trường ảo mới tên là env:

python3 -m venv env

Kích hoạt môi trường ảo vừa tạo:

source env/bin/activate

Bạn sẽ thấy (env) xuất hiện ở đầu dòng lệnh, cho biết môi trường ảo đã được kích hoạt.

Bây giờ, chúng ta sẽ cài đặt Django và thư viện cần thiết để Django có thể “nói chuyện” với PostgreSQL. Thư viện đó là psycopg2.

pip install django psycopg2-binary

psycopg2-binary là một phiên bản biên dịch sẵn của psycopg2, giúp việc cài đặt trở nên dễ dàng hơn vì bạn không cần cài đặt các gói phụ thuộc hệ thống khác.

Sau khi cài đặt xong, hãy tạo một dự án Django mới.

django-admin startproject myproject .

Lưu ý dấu . ở cuối lệnh. Nó yêu cầu Django tạo dự án ngay trong thư mục hiện tại, giúp cấu trúc thư mục gọn gàng hơn.

Hình minh họa

Cấu hình file settings.py để kết nối PostgreSQL

Đây là bước quan trọng nhất: chỉ cho Django biết cách tìm và kết nối với cơ sở dữ liệu PostgreSQL của bạn. Mọi thông tin cấu hình này nằm trong file myproject/settings.py.

Hãy mở file myproject/settings.py bằng trình soạn thảo văn bản yêu thích của bạn. Tìm đến phần DATABASES. Mặc định, nó sẽ được cấu hình để sử dụng SQL là gìlite.

# settings.py (mặc định)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

Chúng ta cần thay đổi nó để trỏ đến cơ sở dữ liệu PostgreSQL đã tạo. Hãy cập nhật lại cấu hình như sau, sử dụng thông tin bạn đã tạo ở bước trước:

# settings.py (cấu hình cho PostgreSQL)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'myprojectdb',
        'USER': 'myprojectuser',
        'PASSWORD': 'your_strong_password',
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

Hãy đảm bảo bạn thay thế myprojectdb, myprojectuser, và your_strong_password bằng thông tin chính xác của bạn.

  • ENGINE: Cho Django biết phải sử dụng driver nào.
  • NAME: Tên cơ sở dữ liệu.
  • USER: Tên người dùng đã tạo.
  • PASSWORD: Mật khẩu của người dùng.
  • HOST: Địa chỉ máy chủ cơ sở dữ liệu. localhost vì nó đang chạy trên cùng một máy.
  • PORT: Cổng mặc định của PostgreSQL5432.

Sau khi lưu file, đã đến lúc kiểm tra kết nối. Chúng ta sẽ sử dụng lệnh migrate của Django. Lệnh này sẽ áp dụng các “di trú” (migrations) ban đầu, tạo các bảng cần thiết cho các ứng dụng mặc định của Django như admin, auth, v.v.

python manage.py migrate

Nếu bạn thấy các dòng chữ “Applying…” và “OK” mà không có bất kỳ thông báo lỗi màu đỏ nào, xin chúc mừng! Django đã kết nối thành công với PostgreSQL.

Hình minh họa

Tạo ứng dụng Django sử dụng PostgreSQL làm cơ sở dữ liệu

Khi kết nối đã được thiết lập thành công, đây là lúc chúng ta thực sự bắt tay vào xây dựng chức năng cho ứng dụng. Chúng ta sẽ tạo một ứng dụng Django đơn giản, định nghĩa một model, và tương tác với cơ sở dữ liệu PostgreSQL để thấy mọi thứ hoạt động như thế nào.

Tạo app Django và xây dựng model cơ bản

Trong Django là gì, một “project” là một tập hợp các cấu hình và ứng dụng. Một “app” là một module nhỏ thực hiện một chức năng cụ thể, ví dụ như một blog, một hệ thống bình chọn, hoặc một cửa hàng.

Hãy tạo một ứng dụng mới tên là blog:

python manage.py startapp blog

Lệnh này sẽ tạo ra một thư mục blog mới với các file cần thiết. Bước tiếp theo là đăng ký ứng dụng này với dự án của chúng ta. Mở lại file myproject/settings.py và thêm 'blog' vào danh sách INSTALLED_APPS.

# settings.py
INSTALLED_APPS = [
    # ... các app khác
    'django.contrib.staticfiles',
    'blog', # Thêm app mới của bạn vào đây
]

Bây giờ, hãy định nghĩa một model. Model là một lớp Python đại diện cho một bảng trong cơ sở dữ liệu. Mở file blog/models.py và thêm đoạn mã sau để tạo một model Post đơn giản:

# blog/models.py
from django.db import models

class Post(models.Model):
    title = models.CharField(max_length=200)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

Model này định nghĩa một bảng tên là blog_post trong PostgreSQL với các cột id, title, content, và created_at.

Sau khi định nghĩa model, chúng ta cần nói cho Django biết về sự thay đổi này. Chạy lệnh makemigrations:

python manage.py makemigrations blog

Lệnh này sẽ tạo một file di trú trong thư mục blog/migrations/, mô tả các thay đổi cần áp dụng vào cơ sở dữ liệu.

Tiếp theo, áp dụng file di trú này vào PostgreSQL:

python manage.py migrate blog

Django sẽ thực thi các lệnh SQL cần thiết để tạo bảng blog_post mới.

Để dễ dàng quản lý dữ liệu, hãy tạo một tài khoản quản trị viên (superuser):

python manage.py createsuperuser

Làm theo hướng dẫn để tạo tên người dùng, email và mật khẩu.

Hình minh họa

Chạy và kiểm tra ứng dụng

Mọi thứ đã sẵn sàng. Giờ là lúc khởi động máy chủ phát triển của Django để xem thành quả.

python manage.py runserver

Bạn sẽ thấy một thông báo cho biết máy chủ đang chạy tại http://127.0.0.1:8000/.

Bây giờ, chúng ta cần hiển thị model Post trong trang quản trị của Django. Mở file blog/admin.py và thêm vào các dòng sau:

# blog/admin.py
from django.contrib import admin
from .models import Post

admin.site.register(Post)

Đoạn mã này đăng ký model Post với trang admin.

Bây giờ, hãy mở trình duyệt và truy cập vào http://127.0.0.1:8000/admin/. Đăng nhập bằng tài khoản superuser bạn vừa tạo. Bạn sẽ thấy một mục “Posts”. Hãy thử nhấp vào đó và tạo một vài bài đăng mới. Mỗi khi bạn lưu một bài đăng, dữ liệu sẽ được ghi trực tiếp vào cơ sở dữ liệu PostgreSQL của bạn.

Một số mẹo debug nhanh:

  • Nếu máy chủ không khởi động, hãy kiểm tra kỹ thông báo lỗi trong terminal. Lỗi cú pháp trong Python là gì là nguyên nhân phổ biến.
  • Nếu bạn không thể truy cập trang admin, đảm bảo rằng bạn đã chạy lệnh migrate đầy đủ.
  • Nếu bạn gặp lỗi liên quan đến cơ sở dữ liệu khi tạo bài đăng, hãy kiểm tra lại cấu hình trong settings.py và đảm bảo dịch vụ PostgreSQL vẫn đang chạy.

Hình minh họa

Kiểm tra và xử lý lỗi thường gặp khi kết nối

Ngay cả với những hướng dẫn chi tiết nhất, đôi khi mọi thứ vẫn không diễn ra như mong đợi. Việc gặp lỗi là một phần tự nhiên của quá trình phát triển. Điều quan trọng là biết cách nhận diện và khắc phục chúng. Dưới đây là hai trong số các lỗi phổ biến nhất khi kết nối Django với PostgreSQL.

Lỗi “could not connect to server”

Đây có lẽ là lỗi đáng sợ nhất nhưng thường có nguyên nhân khá đơn giản. Thông báo lỗi đầy đủ thường trông giống như: django.db.utils.OperationalError: could not connect to server: Connection refused.

Lỗi này có nghĩa là ứng dụng Django của bạn không thể thiết lập kết nối với máy chủ PostgreSQL. Hãy kiểm tra theo các bước sau:

  1. Dịch vụ PostgreSQL có đang chạy không? Đây là nguyên nhân phổ biến nhất. Hãy quay lại terminal và chạy lệnh sudo systemctl status postgresql. Nếu dịch vụ không hoạt động, hãy khởi động lại nó bằng sudo systemctl start postgresql.
  2. Cấu hình HOSTPORT có đúng không? Trong file settings.py, hãy đảm bảo HOST được đặt là localhost hoặc 127.0.0.1 nếu DjangoPostgreSQL đang chạy trên cùng một máy. Kiểm tra xem PORT có phải là 5432 không, trừ khi bạn đã cố tình thay đổi nó.
  3. Tường lửa có chặn kết nối không? Nếu bạn đang chạy tường lửa (ví dụ ufw), nó có thể đang chặn cổng 5432. Hãy thử tạm thời vô hiệu hóa tường lửa để kiểm tra. Nếu kết nối thành công, bạn cần thêm một quy tắc để cho phép lưu lượng truy cập qua cổng 5432: sudo ufw allow 5432/tcp.
  4. Kiểm tra file cấu hình của PostgreSQL: Đôi khi, PostgreSQL có thể không được cấu hình để chấp nhận kết nối từ localhost. Kiểm tra file pg_hba.conf (thường nằm trong /etc/postgresql/VERSION/main/) và đảm bảo có một dòng cho phép kết nối local.

Hình minh họa

Lỗi cấu hình trong settings.py

Một nhóm lỗi khác thường xuất phát từ những sai sót nhỏ trong file settings.py. Những lỗi này có thể hiển thị dưới nhiều dạng khác nhau, thường liên quan đến xác thực hoặc tên cơ sở dữ liệu.

  1. Lỗi xác thực (Authentication failed): Nếu bạn nhận được lỗi như FATAL: password authentication failed for user "myprojectuser", nguyên nhân gần như chắc chắn là do USER hoặc PASSWORD trong settings.py không chính xác. Hãy kiểm tra lại từng ký tự, đảm bảo rằng mật khẩu bạn nhập khớp với mật khẩu bạn đã tạo trong psql.
  2. Cơ sở dữ liệu không tồn tại (Database does not exist): Lỗi FATAL: database "myprojectdb" does not exist rất rõ ràng. Nó có nghĩa là giá trị NAME trong settings.py không khớp với bất kỳ cơ sở dữ liệu nào trên máy chủ PostgreSQL. Hãy đăng nhập lại vào psql bằng lệnh \l để liệt kê tất cả các cơ sở dữ liệu và đảm bảo rằng bạn đã viết đúng tên.
  3. Sai ENGINE: Nếu bạn quên thay đổi ENGINE từ django.db.backends.sqlite3 thành django.db.backends.postgresql, Django sẽ không biết cách sử dụng driver psycopg2 và sẽ báo lỗi. Hãy đảm bảo dòng này được cập nhật chính xác.

Một mẹo hữu ích là sử dụng biến môi trường để lưu trữ các thông tin nhạy cảm như mật khẩu cơ sở dữ liệu thay vì viết thẳng vào code. Các thư viện như Docker là gì hoặc DevOps là gì có thể giúp bạn quản lý việc này một cách dễ dàng và an toàn hơn.

Hình minh họa

Tối ưu hiệu suất và bảo mật khi sử dụng PostgreSQL cùng Django

Thiết lập kết nối thành công chỉ là bước khởi đầu. Để xây dựng một ứng dụng thực sự tốt, bạn cần quan tâm đến hiệu suất và bảo mật. PostgreSQL cung cấp nhiều công cụ mạnh mẽ, và khi kết hợp với các tính năng của Django, bạn có thể tạo ra một hệ thống vừa nhanh vừa an toàn.

Một trong những cách hiệu quả nhất để tăng tốc độ truy vấn cơ sở dữ liệu là sử dụng chỉ mục (indexing). Hãy tưởng tượng bạn đang tìm một chủ đề trong một cuốn sách dày. Thay vì đọc từng trang, bạn sẽ xem mục lục. Chỉ mục trong cơ sở dữ liệu hoạt động tương tự. Trong Django, bạn có thể dễ dàng thêm chỉ mục vào một trường của model bằng cách thêm db_index=True.

class Product(models.Model):
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, db_index=True) # Index cho các truy vấn slug

Điều này đặc biệt hữu ích cho các trường thường được sử dụng trong mệnh đề WHERE, JOIN, hoặc ORDER BY.

Về mặt bảo mật, nguyên tắc đầu tiên là không bao giờ sử dụng tài khoản superuser của PostgreSQL cho ứng dụng Django. Người dùng cơ sở dữ liệu mà bạn tạo cho Django chỉ nên có quyền trên cơ sở dữ liệu của ứng dụng đó, không hơn không kém. Điều này tuân theo “nguyên tắc đặc quyền tối thiểu”. Ngoài ra, đối với môi trường production, bạn nên cân nhắc thiết lập kết nối SSL giữa DjangoPostgreSQL để mã hóa dữ liệu truyền đi, ngăn chặn các cuộc tấn công nghe lén.

Cuối cùng, hãy tận dụng hệ thống caching của Django. Nhiều truy vấn cơ sở dữ liệu được thực hiện lặp đi lặp lại. Bằng cách lưu kết quả của các truy vấn này vào bộ nhớ đệm (cache), bạn có thể giảm đáng kể số lần phải “làm phiền” cơ sở dữ liệu. Redis là gì hỗ trợ nhiều backend cache khác nhau như Memcached hoặc Redis, giúp bạn dễ dàng tích hợp vào ứng dụng của mình. Việc hạn chế các truy vấn không cần thiết, đặc biệt là các truy vấn N+1, bằng cách sử dụng select_relatedprefetch_related cũng là một kỹ thuật tối ưu quan trọng mà mọi nhà phát triển Django nên nắm vững.

Hình minh họa

Kết luận

Chúng ta đã cùng nhau trải qua một hành trình chi tiết, từ việc cài đặt một máy chủ PostgreSQL hoàn toàn mới trên Ubuntu 20.04 cho đến việc xây dựng và chạy một ứng dụng Django kết nối thành công với nó. Bằng cách đi theo từng bước, bạn đã thiết lập được một nền tảng vững chắc và chuyên nghiệp cho các dự án web của mình trong tương lai.

Hãy cùng điểm lại những bước quan trọng:

  • Cài đặt và bảo mật PostgreSQL: Chúng ta đã cài đặt PostgreSQL, tạo một cơ sở dữ liệu và người dùng riêng cho ứng dụng, một thực hành bảo mật cơ bản nhưng vô cùng quan trọng.
  • Thiết lập môi trường Django: Sử dụng môi trường ảo để quản lý các gói phụ thuộc một cách sạch sẽ và cài đặt Django cùng với driver psycopg2.
  • Cấu hình kết nối: Chỉnh sửa file settings.py một cách cẩn thận để Django “biết đường” đến cơ sở dữ liệu PostgreSQL.
  • Xây dựng và kiểm tra: Tạo một ứng dụng, định nghĩa model và sử dụng hệ thống di trú (migrations) của Django để tạo bảng trong cơ sở dữ liệu, chứng minh rằng mọi thứ đang hoạt động trơn tru.
  • Xử lý lỗi: Tìm hiểu nguyên nhân và cách khắc phục các lỗi kết nối và cấu hình phổ biến.

Đây là một kỹ năng nền tảng thiết yếu cho bất kỳ nhà phát triển web nào muốn xây dựng các ứng dụng mạnh mẽ và có khả năng mở rộng. Tuy nhiên, hành trình học hỏi không dừng lại ở đây. Tôi khuyến khích bạn tiếp tục tìm hiểu sâu hơn về các chủ đề nâng cao như tối ưu hóa truy vấn phức tạp, sao lưu và phục hồi cơ sở dữ liệu, cũng như các chiến lược bảo mật nâng cao cho cả DjangoPostgreSQL.

Cảm ơn bạn đã theo dõi bài viết. Hãy thử áp dụng ngay kiến thức này vào dự án tiếp theo của bạn và đừng quên theo dõi các bài viết hướng dẫn chuyên sâu khác trên blog nhé!

Hình minh họa

Đánh giá
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan