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