Trong thế giới phát triển web hiện đại, việc lựa chọn một bộ công cụ mạnh mẽ và đáng tin cậy là yếu tố quyết định thành công của dự án. Django, một framework Python bậc cao, và PostgreSQL, một hệ quản trị cơ sở dữ liệu quan hệ mã nguồn mở mạnh mẽ, chính là sự kết hợp 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. Tuy nhiên, việc kết nối hai công nghệ này trên một môi trường cụ thể như Ubuntu 20.04 đôi khi lại là một thách thức, đặc biệt với những nhà phát triển mới. Bài viết này sẽ là kim chỉ nam, hướng dẫn bạn từng bước một cách chi tiết, từ cài đặt, cấu hình cho đến tối ưu hóa, giúp bạn tự tin làm chủ bộ đôi Django và PostgreSQL.
Giới thiệu
PostgreSQL và Django từ lâu đã được xem là một “cặp đôi vàng” trong lĩnh vực phát triển web. Django cung cấp một cấu trúc phát triển nhanh chóng, an toàn và có tổ chức, trong khi PostgreSQL mang lại một nền tảng cơ sở dữ liệu vững chắc với 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. Việc kết hợp chúng giúp xây dựng các ứng dụng có khả năng chịu tải cao và dễ dàng bảo trì trong tương lai. Tuy nhiên, quá trình thiết lập ban đầu, đặc biệt là việc cấu hình kết nối trên hệ điều hành Ubuntu 20.04, có thể gây bối rối nếu bạn chưa có kinh nghiệm. Nhiều lỗi nhỏ về quyền, cấu hình mạng, hay phiên bản thư viện có thể phát sinh.

Trong bài viết này, chúng ta sẽ cùng nhau đi qua một quy trình hoàn chỉnh. Bắt đầu từ việc cài đặt PostgreSQL và tạo cơ sở dữ liệu trên Ubuntu, tiếp đến là thiết lập một dự án Django mới để kết nối với cơ sở dữ liệu đó. Chúng ta cũng sẽ xây dựng một ứng dụng nhỏ để kiểm tra sự hoạt động, xử lý các lỗi thường gặp và cuối cùng là khám phá các phương pháp tối ưu hiệu suất và bảo mật. Lợi ích lớn nhất khi sử dụng PostgreSQL thay vì SQLite (mặc định của Django) là khả năng mở rộng và sự ổn định vượt trội, sẵn sàng cho các ứng dụng từ nhỏ đến lớn.
Cài đặt PostgreSQL trên Ubuntu 20.04
Để bắt đầu hành trình kết hợp Django và PostgreSQL, bước đầu tiên và quan trọng nhất là cài đặt và cấu hình PostgreSQL một cách chính xác trên máy chủ Ubuntu 20.04 của bạn. Một hệ quản trị cơ sở dữ liệu được cài đặt đúng cách sẽ là nền tảng vững chắc cho toàn bộ ứng dụng sau này.
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 cập nhật danh sách các gói của hệ thống là một thói quen tốt. Điều này đảm bảo bạn sẽ cài đặt được phiên bản mới nhất và an toàn nhất. Hãy mở terminal và chạy lệnh sau:
sudo apt update && sudo apt upgrade -y
Sau khi hệ thống đã được cập nhật, bạn có thể tiến hành cài đặt PostgreSQL. Gói postgresql-contrib được khuyến nghị cài đặt cùng vì nó cung cấp nhiều tiện ích mở rộng hữu ích. Sử dụng lệnh dưới đây:
sudo apt install postgresql postgresql-contrib

Khi quá trình cài đặt hoàn tất, dịch vụ PostgreSQL sẽ tự động khởi động. Để chắc chắn mọi thứ đều hoạt động ổn định, 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), điều đó có nghĩa là PostgreSQL đã được cài đặt và đang chạy thành công. Bạn cũng có thể kiểm tra phiên bản đã cài đặt bằng lệnh: psql --version. Để hiểu rõ hơn về khái niệm Database là gì sẽ giúp ích cho bạn trong quá trình sử dụng.
Tạo và quản lý cơ sở dữ liệu PostgreSQL
PostgreSQL sử dụng một khái niệm gọi là “roles” để quản lý quyền truy cập cơ sở dữ liệu. Mặc định, nó tạo một user tên là postgres với toàn quyền quản trị. Để bắt đầu, bạn cần chuyển sang user này để thực hiện các thao tác quản trị.
sudo -i -u postgres
Sau khi chuyển sang user postgres, bạn có thể truy cập vào giao diện dòng lệnh của PostgreSQL bằng lệnh psql. Tại đây, bạn sẽ thực hiện việc tạo cơ sở dữ liệu và người dùng riêng cho dự án Django của mình. Việc tạo user riêng thay vì dùng user postgres là một nguyên tắc bảo mật quan trọng.
Hãy tạo một cơ sở dữ liệu mới cho dự án:
CREATE DATABASE myprojectdb;
Tiếp theo, tạo một user mới với mật khẩu an toàn. Hãy thay 'your_password' bằng một mật khẩu mạnh của riêng bạn.
CREATE USER myprojectuser WITH PASSWORD 'your_password';

Cuối cùng, bạn cần cấp cho user vừa tạo các quyền cần thiết trên cơ sở dữ liệu của dự án. Các thiết lập này đảm bảo Django có thể hoạt động đúng cách với múi giờ và mã hóa ký tự chuẩn.
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';GRANT ALL PRIVILEGES ON DATABASE myprojectdb TO myprojectuser;
Để thoát khỏi psql, gõ \q. Để quay lại user thường, gõ exit. Giờ đây, bạn đã có một cơ sở dữ liệu và một người dùng sẵn sàng để Django kết nối.
Cài đặt và cấu hình Django để kết nối với PostgreSQL
Khi PostgreSQL đã sẵn sàng, bước tiếp theo là chuẩn bị môi trường Python và cấu hình dự án Django để “nói chuyện” được với cơ sở dữ liệu bạn vừa tạo. Đây là bước then chốt để liên kết backend ứng dụng và nơi lưu trữ dữ liệu.
Thiết lập môi trường Django và cài đặt phụ thuộc
Một trong những thực hành tốt nhất khi làm việc với các dự án Python là sử dụng môi trường ảo (virtual environment). Điều này giúp cô lập các thư viện và phiên bản của dự án, tránh xung đột với các dự án khác trên cùng một máy. Hãy tạo một thư mục cho dự án và thiết lập môi trường ảo bên trong đó.
mkdir myprojectdir && cd myprojectdirpython3 -m venv envsource env/bin/activate
Khi môi trường ảo đã được kích hoạt (bạn sẽ thấy (env) ở đầu dòng lệnh), hãy cài đặt Django và thư viện cần thiết để kết nối với PostgreSQL. psycopg2-binary chính là “cầu nối” giúp Django giao tiếp được với PostgreSQL.
pip install django psycopg2-binary

Sau khi các gói đã được cài đặt, hãy tạo một dự án Django mới. Dấu chấm . ở cuối lệnh sẽ 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.
django-admin startproject myproject .
Cấu hình file settings.py để kết nối PostgreSQL
Bây giờ là lúc bạn “chỉ” cho Django biết nơi để tìm cơ sở dữ liệu. Mở file myproject/settings.py trong trình soạn thảo code yêu thích của bạn và tìm đến phần DATABASES. Mặc định, Django được cấu hình để sử dụng SQLite, một cơ sở dữ liệu dựa trên file rất tiện lợi cho việc phát triển ban đầu nhưng không phù hợp cho môi trường production.
Bạn cần thay đổi cấu hình này để trỏ đến cơ sở dữ liệu PostgreSQL đã tạo. Hãy thay thế toàn bộ khối DATABASES bằng đoạn mã sau, điền thông tin chính xác mà bạn đã tạo ở bước trước (myprojectdb, myprojectuser, và mật khẩu của bạn).
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'myprojectdb', 'USER': 'myprojectuser', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '5432', }}

Để kiểm tra xem cấu hình đã đúng hay chưa, cách tốt nhất là chạy lệnh migrate. Lệnh này sẽ yêu cầu Django Migration là gì, áp dụng các thay đổi cơ sở dữ liệu ban đầu (tạo các bảng cho hệ thống user, admin, session…). Nếu lệnh chạy thành công và không báo lỗi, xin chúc mừng, bạn đã kết nối Django với PostgreSQL thành công!
python manage.py migrate
Kết quả của lệnh này sẽ là một loạt các dòng “Applying…” và “OK”, cho thấy Django đã tạo các bảng cần thiết trong cơ sở dữ liệu PostgreSQL của bạn.
Tạo ứng dụng Django sử dụng PostgreSQL làm cơ sở dữ liệu
Sau khi đã thiết lập thành công kết nối giữa Django và PostgreSQL, đã đến lúc chúng ta xây dựng một cái gì đó cụ thể. Việc tạo một ứng dụng đơn giản và định nghĩa các model sẽ giúp bạn thấy rõ cách Django ORM là gì (Object-Relational Mapping) chuyển đổi code Python thành các bảng và dữ liệu trong PostgreSQL.
Tạo app Django và xây dựng model cơ bản
Trong Django, một “project” là một tập hợp các cấu hình và “app”. Một “app” là một module thực hiện một chức năng cụ thể, ví dụ như blog, cửa hàng, hoặc hệ thống quản lý người dùng. Hãy tạo một app mới tên là store để quản lý sản phẩm.
python manage.py startapp store
Lệnh này sẽ tạo một thư mục mới tên là store với cấu trúc file chuẩn của một app Django. Tiếp theo, bạn cần “đăng ký” app này với project bằng cách thêm tên của nó vào danh sách INSTALLED_APPS trong file myproject/settings.py.
INSTALLED_APPS = [ ..., 'store',]

Bây giờ, hãy mở file store/models.py và định nghĩa một model Product đơn giản. Model này sẽ được Django ORM chuyển thành một bảng trong cơ sở dữ liệu PostgreSQL.
from django.db import models
class Product(models.Model): name = models.CharField(max_length=255) price = models.DecimalField(max_digits=10, decimal_places=2) created_at = models.DateTimeField(auto_now_add=True)
def __str__(self): return self.name
Sau khi định nghĩa model, bạn cần tạo các file “di trú” (Migration là gì). Đây là các file Python mô tả những thay đổi cần thực hiện trên schema của cơ sở dữ liệu. Chạy lệnh:
python manage.py makemigrations store
Và sau đó áp dụng chúng vào cơ sở dữ liệu:
python manage.py migrate
Cuối cùng, hãy tạo một tài khoản quản trị viên (superuser) để có thể truy cập vào trang quản trị của Django. Làm theo các hướng dẫn để đặt tên người dùng, email và mật khẩu.
python manage.py createsuperuser
Chạy và kiểm tra ứng dụng
Mọi thứ đã sẵn sàng để kiểm tra. Hãy khởi động server phát triển của Django:
python manage.py runserver
Mở trình duyệt và truy cập vào địa chỉ 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 giao diện quản trị của Django, nhưng chưa thấy model Product đâu cả. Đó là vì chúng ta cần đăng ký nó.
Mở file store/admin.py và thêm vào đoạn code sau:
from django.contrib import adminfrom .models import Product
admin.site.register(Product)

Quay lại trình duyệt và tải lại trang admin. Bây giờ bạn sẽ thấy mục “Products”. Hãy thử bấm vào và thêm một vài sản phẩm mẫu. Mỗi khi bạn lưu một sản phẩm, một bản ghi mới sẽ được tạo trong bảng store_product bên trong cơ sở dữ liệu PostgreSQL. Đây là minh chứng rõ ràng nhất cho thấy sự kết nối và hoạt động trơn tru giữa ứng dụng Django và PostgreSQL.
Nếu có lỗi xảy ra, hãy kiểm tra kỹ terminal nơi bạn chạy lệnh runserver. Nó sẽ cung cấp các thông báo lỗi chi tiết giúp bạn xác định vấn đề, có thể là do sai sót trong models.py hoặc admin.py. Việc nắm rõ Debug là gì sẽ hỗ trợ rất nhiều trong giai đoạn này.
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, quá trình kết nối Django và PostgreSQL vẫn có thể gặp phải một vài trục trặc. Việc nhận biết và khắc phục các lỗi phổ biến là một kỹ năng quan trọng. Dưới đây là hai lỗi thường gặp nhất và cách giải quyết chúng một cách nhanh chóng.
Lỗi “could not connect to server”
Đây có lẽ là lỗi phổ biến nhất. Thông báo lỗi đầy đủ thường là psycopg2.OperationalError: could not connect to server: Connection refused. Lỗi này cho biết ứ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. Có một vài nguyên nhân chính:
- Dịch vụ PostgreSQL không chạy: Đây là nguyên nhân hàng đầu. Có thể máy chủ đã khởi động lại hoặc dịch vụ đã dừng vì một lý do nào đó. Hãy kiểm tra trạng thái bằng lệnh
sudo systemctl status postgresql. Nếu nó không hoạt động, hãy khởi động lại bằngsudo systemctl start postgresql. - Sai thông tin HOST hoặc PORT: Trong file
settings.py, hãy đảm bảoHOSTđược đặt là'localhost'(hoặc127.0.0.1) vàPORTlà'5432'(hoặc để trống để dùng cổng mặc định). Sai một ký tự cũng có thể gây ra lỗi. - Tường lửa (Firewall) chặn kết nối: Mặc dù ít phổ biến hơn khi kết nối trên cùng một máy (localhost), nhưng tường lửa có thể được cấu hình để chặn cổng 5432. Bạn có thể kiểm tra trạng thái tường lửa với lệnh
sudo ufw statusvà nếu cần, cho phép kết nối qua cổng này vớisudo ufw allow 5432/tcp.

Lỗi cấu hình trong settings.py
Một nhóm lỗi khác xuất phát trực tiếp từ các thông tin bạn cung cấp trong khối DATABASES của file settings.py. Thông báo lỗi có thể là FATAL: password authentication failed for user "myprojectuser" hoặc FATAL: database "myprojectdb" does not exist.
- Sai
USERhoặcPASSWORD: Đây là lỗi đơn giản nhất. Hãy kiểm tra lại từng ký tự trong tên người dùng và mật khẩu. Đôi khi việc sao chép/dán có thể thêm vào các khoảng trắng không mong muốn. Mật khẩu bạn đặt trongpsqlphải khớp chính xác với mật khẩu trongsettings.py. - Sai
NAME(tên cơ sở dữ liệu): Tương tự như trên, hãy đảm bảo tên cơ sở dữ liệu trongsettings.pytrùng khớp với tên bạn đã tạo bằng lệnhCREATE DATABASE. - Chưa cài đặt
psycopg2-binary: Nếu bạn quên cài đặt thư viện này, Django sẽ báo lỗi không tìm thấy backend cơ sở dữ liệu. Lỗi thường có dạngdjango.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module. Giải pháp đơn giản là chạy lại lệnhpip install psycopg2-binarytrong môi trường ảo của bạn.
Khi gặp lỗi, hãy đọc kỹ thông báo trên terminal. Nó thường cung cấp manh mối rất rõ ràng về nguyên nhân gốc rễ của vấn đề, giúp bạn khoanh vùng và sửa lỗi hiệu quả hơn.
Tối ưu hiệu suất và bảo mật khi sử dụng PostgreSQL cùng Django
Khi ứng dụng của bạn đã hoạt động ổn định, bước tiếp theo là nghĩ đến việc tối ưu hóa để nó chạy nhanh hơn và an toàn hơn. PostgreSQL cung cấp nhiều tính năng mạnh mẽ, và khi kết hợp với các công cụ của Django, bạn có thể cải thiện đáng kể hiệu suất và độ bảo mật của hệ thống.
Một trong những cách tối ưu hiệu suất truy vấn đơn giản và hiệu quả nhất là sử dụng chỉ mục (indexing). Hãy tưởng tượng cơ sở dữ liệu của bạn như một cuốn sách. Nếu không có mục lục, bạn phải lật từng trang để tìm thông tin. Chỉ mục hoạt động như mục lục, giúp PostgreSQL tìm thấy dữ liệu nhanh hơn rất nhiều. Trong Django, bạn có thể dễ dàng thêm chỉ mục vào một trường trong model bằng cách thêm tùy chọn db_index=True.
class Product(models.Model): name = models.CharField(max_length=255, db_index=True) ...
Điều này đặc biệt hữu ích cho các trường thường xuyên được sử dụng trong các mệnh đề WHERE hoặc ORDER BY.
Về mặt bảo mật, một nguyên tắc vàng là không bao giờ lưu trữ thông tin nhạy cảm như mật khẩu cơ sở dữ liệu trực tiếp trong file settings.py. Thay vào đó, hãy sử dụng biến môi trường. Các thư viện như Config file là gì giúp việc này trở nên dễ dàng. Bạn có thể lưu mật khẩu vào một file .env (không đưa file này lên Git) và đọc nó trong settings.py. Điều này giúp ngăn chặn việc lộ thông tin bí mật khi chia sẻ code.
Ngoài ra, hãy luôn đảm bảo rằng user PostgreSQL mà Django sử dụng chỉ có quyền trên cơ sở dữ liệu của dự án đó, không hơn không kém. Tránh sử dụng user postgres hoặc các user có quyền superuser cho ứng dụng. Trong môi trường production, việc thiết lập kết nối SSL giữa Django và PostgreSQL cũng là một bước quan trọng để 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 cache của Django để lưu lại kết quả của các truy vấn tốn kém, giảm tải cho cơ sở dữ liệu và tăng tốc độ phản hồi cho người dùng.
Kết luận
Qua bài viết này, chúng ta đã cùng nhau đi qua một hành trình chi tiết để kết hợp thành công Django và PostgreSQL trên nền tảng Ubuntu 20.04. Từ những bước cơ bản như cài đặt và cấu hình PostgreSQL, thiết lập dự án Django, cho đến việc xây dựng ứng dụng, xử lý lỗi và các kỹ thuật tối ưu hóa ban đầu. Việc làm chủ quy trình này sẽ mở ra cho bạn khả năng xây dựng các ứng dụng web mạnh mẽ, có khả năng mở rộng và đáng tin cậy.
Các bước quan trọng cần nhớ bao gồm: cài đặt PostgreSQL và tạo user/database riêng biệt, sử dụng môi trường ảo cho dự án Django, cài đặt psycopg2-binary, cấu hình chính xác file settings.py, và sử dụng các lệnh Migration là gì, migrate để đồng bộ model với cơ sở dữ liệu. Việc hiểu rõ cách xử lý các lỗi phổ biến như “could not connect to server” cũng sẽ giúp bạn tiết kiệm rất nhiều thời gian trong quá trình phát triển.
Hành trình học hỏi không dừng lại ở đây. Chúng 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 với select_related và prefetch_related, triển khai Database replication để tăng tính sẵn sàng, và các biện pháp bảo mật nâng cao cho PostgreSQL. Hãy áp dụng những kiến thức này vào dự án của bạn và đừng ngần ngại thử nghiệm. Chúc bạn thành công trên con đường phát triển web chuyên nghiệp cùng Django và PostgreSQL!