CÔNG CỤ
MODULES
THAM KHẢO
Cách chia List thành các phần bằng nhau trong Python Cách xóa một khóa (key) ra khỏi dictionary trong Python Hướng dẫn chuyển đổi file Google Colab sang Markdown trong Python Bài tập Python: Lập trình cơ sở dữ liệu trong Python Kết nối cơ sở dữ liệu MySQL Python Hướng dẫn kết nối Python PostgreSQL bằng Psycopg2 Hướng dẫn kết nối SQLite sử dụng sqlite3 trong Python Bài tập Python : Pandas trong Python Phạm vi số float của Python Cách lên lịch chạy script Python bằng GitHub Actions Cách tạo hằng số trong Python Các nền tảng lưu trữ tốt nhất cho ứng dụng và script Python 6 Tip viết vòng lặp For hiệu quả hơn trong Python Cách đảo ngược Chuỗi String trong Python Cách gỡ lỗi ứng dụng Python trong Docker Container bằng VS Code 10 tip One Liner bạn cần biết trong Python Cách áp dụng ngưỡng hình ảnh trong Python với NumPy Tìm hiểu về các phép toán Groupby trong Pandas Lập trình Socket trong Python Mô-đun base64 trong Python Cách giới hạn float values trong Python Tìm hiểu Mô-đun statistics Trong Python File Organizing trong Python Đổi tên File trong Python Tìm hiểu về Deque trong Python Mô-đun Calendar trong Python Tìm hiểu về Enum trong Python Sử dụng pprint trong Python Làm việc với cấu trúc Dữ liệu Stack trong Python Thư viện functools trong Python Tip sử dụng hàm round() với tham số âm trong Python Hàm print có thể nhận thêm các tham số bổ sung trong Python Tip tìm chuỗi dài nhất bằng hàm max() trong Python Cách lặp qua nhiều list với hàm zip() trong Python Tìm hiểu về MLOps trong Python Docker và Kubernetes với MLOps trong Python Kết hợp DevOps với MLOps trong Python Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python tối ưu quy trình MLOps Với Python Sự khác biệt giữa byte objects và string trong Python Top 4 thư viện phổ biến nhất của NLP trong Python Cách sử dụng ThreadPoolExecutor trong Python Phân tích dữ liệu Blockchain với Python Hướng dẫn triển khai Smart Contracts với Python Blockchain APIs với Python Làm việc với file ZIP trong Python Sự khác biệt giữa toán tử == và is trong Python Chuyển đổi kiểu dữ liệu trong Python Cách làm việc với file tarball/tar trong Python Sự khác biệt giữa iterator và iterable trong Python Sự khác biệt giữa set() và frozenset() trong Python Làm việc với các biến môi trường trong Python Một tác vụ phổ biến khi làm việc với danh sách trong Python Định dạng chuỗi Strings trong Python Sử dụng Poetry để quản lý dependencies trong Python Sự khác biệt giữa sort() và sorted() trong Python Từ khóa yield trong Python Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass Cách truy cập và thiết lập biến môi trường trong Python Hướng dẫn toàn diện về module datetime trong Python Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python Quản lý sinh viên Python & MySQL
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.

Hướng dẫn kết nối Python PostgreSQL bằng Psycopg2

Trong hướng dẫn này, mình sẽ tìm hiểu cách sử dụng mô-đun Psycopg2 để tương tác với cơ sở dữ liệu PostgreSQL từ Python. PostgreSQL là một hệ quản trị cơ sở dữ liệu mã nguồn mở mạnh mẽ và được ưa chuộng trong cộng đồng phát triển phần mềm.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Dưới đây là danh sách các mô-đun Python có sẵn để hoạt động với máy chủ cơ sở dữ liệu PostgreSQL.

  • Psycopg2
  • pg8000
  • py-postgresql
  • PyGreSQL
  • ocpgdb
  • bpgsql
  • SQLAlchemy. SQLAlchemy cần cài đặt riêng bất kỳ thứ nào ở trên.

Lý do chọn Psycopg2

Có nhiều mô-đun Python khác để làm việc với PostgreSQL, nhưng chúng tôi chọn Psycopg2 vì nó:

Bài viết này được đăng tại [free tuts .net]

  • Phổ biến và ổn định: Psycopg2 được sử dụng rộng rãi trong cộng đồng Python và PostgreSQL và đã được thử nghiệm đầy đủ trong các dự án lớn.

  • Hỗ trợ Python 2 và 3: Psycopg2 hỗ trợ cả Python 2 và Python 3, giúp bạn tương thích với các phiên bản khác nhau của Python.

  • An toàn theo luồng: Nó được thiết kế để làm việc với các ứng dụng đa luồng, và chia sẻ kết nối giữa các luồng có thể thực hiện một cách an toàn.

Cài đặt Psycopg2 bằng lệnh pip

Để sử dụng PostgreSQL từ Python, bạn cần cài đặt phiên bản Psycopg2 hiện tại (2.8.6). Mô-đun này có sẵn trên pypi.org và bạn có thể cài đặt nó bằng lệnh pip. Dưới đây là hướng dẫn cài đặt và xác minh cài đặt Psycopg2:

Cài đặt Psycopg2 bằng pip:

Sử dụng lệnh sau để cài đặt Psycopg2 trên mọi hệ điều hành, bao gồm Windows, macOS, Linux, Unix và Ubuntu:

pip install psycopg2

Nếu bạn muốn cài đặt một phiên bản cụ thể, bạn có thể thực hiện như sau:

pip install psycopg2==2.8.6

Nếu bạn gặp lỗi cài đặt pip như "lỗi kết nối: [SSL: CERTIFICATE_VERIFY_FAILED] xác minh chứng chỉ không thành công (_ssl.c:598)", bạn có thể khắc phục lỗi này bằng cách đặt pypi.org và files.pythonhosted.org làm máy chủ đáng tin cậy. Thử lệnh sau:

python -m pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org --trusted-host pypi.python.org psycopg2

Mô-đun Psycopg2 hiện hỗ trợ:

  • Python phiên bản 2.7 và Python 3 phiên bản từ 3.4 đến 3.8.
  • Các phiên bản máy chủ PostgreSQL từ 7.4 đến 12.
  • Phiên bản thư viện máy khách PostgreSQL từ 9.1.

Xác minh cài đặt Psycopg2

Sau khi đã cài đặt thành công, bạn sẽ nhận được các thông báo sau khi chạy lệnh cài đặt:

Thu thập psycopg2
Đang tải xuống psycopg2-2.8.6
Cài đặt các gói đã thu thập: psycopg2
Đã cài đặt thành công psycopg2-2.8.6

Nếu bạn đang sử dụng Anaconda, bạn có thể sử dụng lệnh sau để cài đặt Psycopg2:

conda install -c anaconda psycopg2

Bây giờ bạn đã cài đặt Psycopg2 thành công và có thể bắt đầu sử dụng nó để kết nối và làm việc với cơ sở dữ liệu PostgreSQL từ Python.

Kết nối cơ sở dữ liệu Python PostgreSQL

Trong phần này,mình sẽ hướng dẫn cách kết nối đến cơ sở dữ liệu PostgreSQL từ Python bằng mô-đun Psycopg2.

Các Tham số Kết nối Cần Thiết

Trước khi kết nối, bạn cần biết các thông tin sau về máy chủ PostgreSQL:

  • Tên người dùng: Đây là tên người dùng bạn sử dụng để truy cập PostgreSQL. Mặc định cho cơ sở dữ liệu PostgreSQL là "postgres".

  • Mật khẩu: Mật khẩu mà bạn đã thiết lập khi cài đặt PostgreSQL.

  • Tên máy chủ: Đây là tên máy chủ hoặc địa chỉ IP nơi PostgreSQL đang chạy. Nếu PostgreSQL đang chạy trên máy tính cục bộ, bạn có thể sử dụng "localhost" hoặc địa chỉ IP của máy local (thường là 127.0.0.1).

  • Tên cơ sở dữ liệu: Tên của cơ sở dữ liệu mà bạn muốn kết nối đến. Trong ví dụ này, chúng ta sử dụng cơ sở dữ liệu có tên "postgres_db".

Cách Kết nối với PostgreSQL bằng Python

Cài đặt mô-đun Psycopg2:

Đầu tiên, bạn cần cài đặt và nhập mô-đun psycopg2. Sử dụng câu lệnh sau để cài đặt nó:

pip install psycopg2

Sử dụng phương thức connect():

Sử dụng phương thức psycopg2.connect() với các tham số cần thiết để kết nối đến PostgreSQL. Nó sẽ trả về một đối tượng Connection nếu kết nối được thiết lập thành công.

Tạo đối tượng con trỏ (cursor()):

Sau khi kết nối, bạn cần tạo một đối tượng con trỏ bằng cách sử dụng phương thức connection.cursor() để thực thi các truy vấn PostgreSQL từ Python.

Sử dụng phương thức execute():

Sử dụng phương thức execute() để chạy các truy vấn SQL và nhận kết quả từ cơ sở dữ liệu.

Trích xuất kết quả:

Sử dụng các phương thức con trỏ như fetchone(), fetchmany(), hoặc fetchall() để đọc kết quả truy vấn.

Đóng con trỏ và kết nối:

Để đảm bảo tính bảo mật và giải phóng tài nguyên, luôn đóng con trỏ và kết nối sau khi hoàn thành công việc làm việc với cơ sở dữ liệu PostgreSQL.

anh23 1  jpg

Ví dụ Kết nối PostgreSQL từ Python

Dưới đây là một ví dụ Python để kết nối đến cơ sở dữ liệu PostgreSQL và thực hiện truy vấn SQL:

import psycopg2
from psycopg2 import Error

try:
    # Kết nối đến cơ sở dữ liệu tồn tại
    connection = psycopg2.connect(user="postgres",
                                  password="your_password",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="postgres_db")

    # Tạo một đối tượng con trỏ để thực hiện các thao tác cơ sở dữ liệu
    cursor = connection.cursor()

    # In thông tin máy chủ PostgreSQL
    print("Thông tin máy chủ PostgreSQL")
    print(connection.get_dsn_parameters(), "\n")

    # Thực thi truy vấn SQL
    cursor.execute("SELECT version();")

    # Trích xuất kết quả
    record = cursor.fetchone()
    print("Bạn đang kết nối đến - ", record, "\n")

except (Exception, Error) as error:
    print("Lỗi khi kết nối đến PostgreSQL:", error)

finally:
    if (connection):
        cursor.close()
        connection.close()
        print("Kết nối PostgreSQL đã được đóng")

Trong ví dụ này, chúng ta thực hiện một truy vấn SELECT version(); để xem phiên bản PostgreSQL. Mọi lỗi và ngoại lệ của cơ sở dữ liệu được xử lý bằng lớp Error của Psycopg2 để làm cho ứng dụng mạnh mẽ hơn và dễ bảo trì hơn. Cuối cùng, ta đóng con trỏ và kết nối sau khi hoàn thành công việc làm việc với cơ sở dữ liệu PostgreSQL.

Kết quả

Thông tin máy chủ PostgreSQL
{'user': 'postgres', 'dbname': 'postgres_db', 'host': '127.0.0.1', 'port': '5432', 'tty': '', 'options': '', 'sslmode': 'prefer', 'sslcompression': '0', 'krbsrvname': 'postgres', 'target_session_attrs': 'any'}

Bạn đang kết nối đến - ('PostgreSQL 12.2')
Kết nối PostgreSQL đã được đóng

Trong kết quả này:

  • "Thông tin máy chủ PostgreSQL" hiển thị các tham số kết nối, bao gồm tên người dùng, tên cơ sở dữ liệu, tên máy chủ, và nhiều thông tin khác.

  • "Bạn đang kết nối đến -" cho biết bạn đã kết nối thành công và hiển thị phiên bản PostgreSQL.

  • "Kết nối PostgreSQL đã được đóng" cho biết kết nối đã được đóng sau khi công việc hoàn thành.

Nếu bạn thay đổi các tham số kết nối trong mã ví dụ, bạn sẽ nhận được thông tin tương tự, nhưng với giá trị tham số tương ứng của bạn.

Tạo Bảng PostgreSQL bằng Python

Trong phần này, mình sẽ tìm hiểu cách tạo một bảng trong cơ sở dữ liệu PostgreSQL bằng Python. Ví dụ sau đây mô tả cách tạo một bảng "Mobile" trong cơ sở dữ liệu PostgreSQL.

import psycopg2
from psycopg2 import Error

try:
    # Kết nối đến cơ sở dữ liệu PostgreSQL
    connection = psycopg2.connect(user="postgres",
                                  password="your_password",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="postgres_db")

    # Tạo một đối tượng con trỏ để thực hiện các thao tác cơ sở dữ liệu
    cursor = connection.cursor()

    # Truy vấn SQL để tạo một bảng mới
    create_table_query = '''CREATE TABLE mobile
          (ID INT PRIMARY KEY     NOT NULL,
          MODEL           TEXT    NOT NULL,
          PRICE         REAL); '''

    # Thực thi truy vấn: điều này sẽ tạo một bảng mới
    cursor.execute(create_table_query)

    # Cam kết các thay đổi vào cơ sở dữ liệu
    connection.commit()

    print("Bảng được tạo thành công trong PostgreSQL")

except (Exception, Error) as error:
    print("Lỗi khi kết nối đến PostgreSQL:", error)

finally:
    if connection:
        cursor.close()
        connection.close()
        print("Kết nối PostgreSQL đã được đóng")

Kết quả:

Bảng được tạo thành công trong PostgreSQL
Kết nối PostgreSQL đã được đóng

anh24 jpg

Trong ví dụ này:

  • Mình sử dụng câu lệnh SQL CREATE TABLE để tạo một bảng mới có tên "mobile" với ba cột: "ID," "MODEL," và "PRICE."

  • Sau khi tạo bảng, mình cam kết các thay đổi bằng cách sử dụng phương thức connection.commit() để lưu cấu trúc bảng vào cơ sở dữ liệu.

  • Cuối cùng, mình đóng con trỏ và kết nối sau khi công việc làm việc với cơ sở dữ liệu PostgreSQL đã hoàn thành.

Ánh xạ giữa các loại Python và PostgreSQL

Khi làm việc với PostgreSQL từ Python bằng Psycopg2, có một ánh xạ mặc định giữa các loại dữ liệu Python và PostgreSQL. Dưới đây là bảng ánh xạ giữa các loại dữ liệu Python và tương đương PostgreSQL:

Python PostgreSQL
None NULL
bool bool
float realhoặcdouble
int smallint
integer
bigint
Decimal numeric
str varchar
text
date date
time time
timetz
datetime timestamp
timestamptz
timedelta interval
list ARRAY
tuple Cú pháp kiểu
IN tổng hợp
dict hstore

Khi thực hiện truy vấn PostgreSQL bằng Python, Psycopg2 sẽ tự động chuyển đổi giữa các loại dữ liệu này.

Thực hiện các thao tác CRUD PostgreSQL từ Python

Dưới đây là một ví dụ về cách thực hiện các thao tác CRUD (Create, Read, Update, Delete) trên cơ sở dữ liệu PostgreSQL từ Python:

import psycopg2

try:
    connection = psycopg2.connect(user="postgres",
                                  password="your_password",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="postgres_db")

    cursor = connection.cursor()

    # Thêm một bản ghi mới vào bảng
    insert_query = """INSERT INTO mobile (ID, MODEL, PRICE) VALUES (1, 'Iphone12', 1100)"""
    cursor.execute(insert_query)
    connection.commit()
    print("1 Bản ghi được chèn thành công")

    # Lấy tất cả các bản ghi từ bảng
    cursor.execute("SELECT * FROM mobile")
    record = cursor.fetchall()
    print("Kết quả ", record)

    # Cập nhật một bản ghi trong bảng
    update_query = """UPDATE mobile SET price = 1500 WHERE id = 1"""
    cursor.execute(update_query)
    connection.commit()
    count = cursor.rowcount
    print(count, "Bản ghi được cập nhật thành công")

    # Xóa một bản ghi khỏi bảng
    delete_query = """DELETE FROM mobile WHERE id = 1"""
    cursor.execute(delete_query)
    connection.commit()
    count = cursor.rowcount
    print(count, "Bản ghi đã được xóa thành công")

except (Exception, psycopg2.Error) as error:
    print("Lỗi khi kết nối đến PostgreSQL:", error)

finally:
    if connection:
        cursor.close()
        connection.close()
        print("Kết nối PostgreSQL đã được đóng")

Trong ví dụ này:

  • Mình sử dụng các truy vấn SQL để thực hiện các thao tác CRUD, bao gồm chèn (INSERT), chọn (SELECT), cập nhật (UPDATE), và xóa (DELETE) dữ liệu trong bảng PostgreSQL từ Python.

  • Sau mỗi truy vấn, ta cam kết (commit()) các thay đổi vào cơ sở dữ liệu để lưu trữ dữ liệu mới.

  • Cuối cùng, mình đóng kết nối và con trỏ sau khi công việc với cơ sở dữ liệu PostgreSQL đã hoàn thành.

Làm Việc với Ngày và Giờ PostgreSQL Bằng Python

Trong phần này, mình sẽ tìm hiểu cách làm việc với các kiểu dữ liệu ngày và giờ của PostgreSQL trong Python và ngược lại. Đối với hầu hết các thao tác liên quan đến ngày và giờ, thường cần thêm, đọc hoặc chèn dữ liệu ngày và giờ vào cơ sở dữ liệu PostgreSQL từ ứng dụng Python của mình.

Mô-đun psycopg2 của Python có khả năng tự động ánh xạ giữa kiểu dữ liệu ngày và giờ của PostgreSQL và kiểu dữ liệu Python. Khi bạn thực hiện truy vấn chèn dữ liệu ngày và giờ vào PostgreSQL bằng datetime đối tượng Python, psycopg2 sẽ tự động chuyển đổi chúng thành định dạng timestamp phù hợp để chèn vào bảng.

Ngược lại, khi bạn đọc dữ liệu từ PostgreSQL bằng Python, các giá trị timestamp sẽ được tự động chuyển đổi thành datetime đối tượng Python.

Trong ví dụ sau, mình sử dụng một bảng "Item" để minh họa. Đầu tiên, hãy sao chép và thực hiện các truy vấn SQL dưới đây trong công cụ truy vấn PostgreSQL của bạn để có dữ liệu cho ví dụ này:

CREATE TABLE item ( 
    item_id serial NOT NULL PRIMARY KEY, 
    item_name VARCHAR (100) NOT NULL, 
    purchase_time timestamp NOT NULL,
    price INTEGER NOT NULL
);

Tiếp theo, hãy hiểu kịch bản này thông qua ví dụ đơn giản:

import datetime
import psycopg2

try:
    connection = psycopg2.connect(user="postgres",
                                  password="pynative@#29",
                                  host="127.0.0.1",
                                  port="5432",
                                  database="postgres_db")

    cursor = connection.cursor()

    # Thực hiện truy vấn SQL để chèn ngày và giờ vào bảng
    insert_query = """ INSERT INTO item (item_id, item_name, purchase_time, price) VALUES (%s, %s, %s, %s)"""
    item_purchase_time = datetime.datetime.now()
    item_tuple = (12, "Keyboard", item_purchase_time, 150)
    cursor.execute(insert_query, item_tuple)
    connection.commit()
    print("Đã chèn thành công 1 mục")

    # Đọc giá trị timestamp từ PostgreSQL và chuyển đổi thành datetime Python
    cursor.execute("SELECT purchase_time FROM item WHERE item_id = 12")
    purchase_datetime = cursor.fetchone()
    print("Ngày mua hàng là ", purchase_datetime[0].date())
    print("Thời gian mua vật phẩm là ", purchase_datetime[0].time())

except (Exception, psycopg2.Error) as error:
    print("Lỗi khi kết nối đến PostgreSQL:", error)

finally:
    if connection:
        cursor.close()
        connection.close()
        print("Kết nối PostgreSQL đã được đóng")

Trong ví dụ này:

  • Mình sử dụng truy vấn SQL để chèn dữ liệu ngày và giờ vào bảng "Item" trong cơ sở dữ liệu PostgreSQL từ Python. Để chèn ngày và giờ hiện tại, sử dụng datetime.datetime.now() để tạo đối tượng datetime Python.

  • Sau đó, ta thực hiện một truy vấn SQL để đọc giá trị timestamp từ cơ sở dữ liệu PostgreSQL và chuyển đổi nó thành đối tượng datetime Python.

  • Cuối cùng, mình cam kết các thay đổi và đóng kết nối sau khi hoàn thành công việc với cơ sở dữ liệu PostgreSQL.

Kết bài

Trong bài viết này, mình đã học cách làm việc với cơ sở dữ liệu PostgreSQL bằng Python và mô-đun Psycopg2. Ta đã thực hiện các bước cài đặt Psycopg2, kết nối đến cơ sở dữ liệu, tạo bảng, và thực hiện các truy vấn CRUD. Ngoài ra, chúng ta cũng đã tìm hiểu cách làm việc với các kiểu dữ liệu ngày và giờ PostgreSQL.

Hướng dẫn này giúp bạn bắt đầu làm việc với PostgreSQL từ Python và tận dụng khả năng mạnh mẽ của cơ sở dữ liệu này trong ứng dụng của bạn.

Cùng chuyên mục:

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn xây dựng Command-Line Interface (CLI) bằng Quo trong Python

Hướng dẫn toàn diện về module datetime trong Python

Hướng dẫn toàn diện về module datetime trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Cách truy cập và thiết lập biến môi trường trong Python

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Lớp dữ liệu (Data Classes) trong Python với decorator @dataclass

Từ khóa yield trong Python

Từ khóa yield trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sự khác biệt giữa sort() và sorted() trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Sử dụng Poetry để quản lý dependencies trong Python

Định dạng chuỗi Strings trong Python

Định dạng chuỗi Strings trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Một tác vụ phổ biến khi làm việc với danh sách trong Python

Làm việc với các biến môi trường trong Python

Làm việc với các biến môi trường trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa set() và frozenset() trong Python

Sự khác biệt giữa iterator và iterable trong Python

Sự khác biệt giữa iterator và iterable trong Python

Cách làm việc với file tarball/tar trong Python

Cách làm việc với file tarball/tar trong Python

Chuyển đổi kiểu dữ liệu trong Python

Chuyển đổi kiểu dữ liệu trong Python

Sự khác biệt giữa toán tử == và is trong Python

Sự khác biệt giữa toán tử == và is trong Python

Làm việc với file ZIP trong Python

Làm việc với file ZIP trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Cách sử dụng ThreadPoolExecutor trong Python

Sự khác biệt giữa byte objects và string trong Python

Sự khác biệt giữa byte objects và string trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format  trong Python

Xử lý độ chính xác các hàm floor, ceil, round, trunc, format trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Cách lặp qua nhiều list với hàm zip() trong Python

Top