PostgreSQL là một hệ quản trị cơ sở dữ liệu quan hệ theo kiểu đối tượng, mã nguồn mở. Nó được biết đến bởi độ tin cậy, khả năng quản lý cơ sở dữ liệu mạnh mẽ và hiệu năng tốt. PostgreSQL sở hữu rất nhiều thư viện API (Application programming interface) sẵn có dành cho nhiều ngôn ngữ lập trình phổ biến, chẳng hạn như Python. Nó cung cấp rất nhiều tính năng quan trị cơ sở dữ liệu như View, Trigger, Index (sử dụng B-Tree), v.v…
Có một số module Python cho phép chúng ta kết nối tới và thao tác với cơ sở dữ liệu bằng PostgreSQL:
– Psycopg2
– pg8000
– py-postgresql
– PyGreSQL
Trong đó Psycopg2 là một trong những Python driver phổ biến nhất dành cho PostgreSQL. Nó được tích cực duy trì và cung cấp hỗ trợ cho nhiều phiên bản Python khác nhau. Ngoài ra các kết nối tới cơ sở dữ liệu được hỗ trợ bởi Pssycopg2 đều là thread-safe (tức là đảm bảo an toàn về luồng), do đó Psycopg2 có thể được sử dụng trong các ứng dụng đa luồng. Vì các lý do này, Psycopg2 đã trở thành một lựa chọn phổ biến dành cho các developers.
Trong bài này, chúng ta sẽ khám phá các tính năng của PostgreSQL bằng cách sử dụng Psycopg2 để xây dựng một hệ quản trị cơ sở dữ liệu đơn giản trong Python.
Nội dung chính
1. Cài đặt
– Câu lệnh để cài đặt Psycopg2 là:
sudo pip3 install psycopg2
– Lưu ý: Nếu bạn đang sử dụng Python 2 thì hãy dùng lệnh pip install thay vì pip3 install. Ngoài ra, một khi psycopg đã được cài đặt trong hệ thống của bạn, chúng ta sẽ có thể kết nối đến cơ sở dữ liệu và thực thi các truy vấn trong Python.
2. Tạo cơ sở dữ liệu
Trước khi có thể truy cập vào cơ sở dữ liệu bằng Python, chúng ta cần tạo ra cơ sở dữ liệu trong postgresql đã. Để tạo cơ sở dữ liệu, bạn hãy làm theo các bước sau:
1. Đăng nhập vào PostgreSQL:
sudo -u postgres psql
2. Thiết lập passowrd
\password
Tiếp theo bạn sẽ được nhắc để nhập vào password. Bạn hãy cố nhớ password của mình bởi vì chúng ta sẽ sử dụng nó để kết nối đến cơ sở dữ liệu bằng Python.
3. Tạo một cơ sở dữ liệu có tên là “test”. Chúng ta sẽ kết nối đến cơ sở dữ liệu này.
CREATE DATABASE test;
Khi cơ sở dữ liệu và password đã được thiết lập, bạn hãy thoát khỏi psql server.
3. Kết nối đến cơ sở dữ liệu
Phương thức connect() được sử dụng để thiết lập kết nối với cơ sở dữ liệu. Nó nhận vào 5 tham số:
1. database: Tên của cơ sở dữ liệu mà bạn muốn kết nối đến
2. user: username của hệ thống cục bộ (local system) của bạn
3. password: Mật khẩu để đăng nhập vào psql
4. host: Được thiết lập là localhost theo mặc định
5. port: Là số cổng, được đặt là 5432 theo mặc định
conn = psycopg2.connect(
database="test",
user = "adith",
password = "password",
host = "localhost",
port = "5432")
Khi kết nối đã được thiết lập, chúng ta có thể sử dụng Python để thao tác với cơ sở dữ liệu.
Cursor object (đối tượng con trỏ cơ sở dữ liệu) được sử dụng để thực thi các truy vấn sql, chúng ta có thể tạo ra một cursor object bằng cách sử dụng đối tượng kết nối (đối tượng conn):
cur = conn.cursor()
Bằng cách sử dụng đối tượng cur này, chúng ta có thể thực hiện các thay đổi lên cơ sở dữ liệu mà ta đã kết nối đến.
Sau khi đã thực thi xong tất cả các truy vấn, chúng ta cần ngắt kết nối đến cơ sở dữ liệu. Việc không ngắt kết nối cơ sở dữ liệu sau khi đã thao tác xong sẽ không gây ra bất kỳ lỗi nào nhưng, ngắt kết nối cơ sở dữ liệu sau khi đã thao tác xong thường được coi là một good practice, tức là một thói quen tốt.
conn.close()
4. Thực thi các truy vấn
Phương thức execute() sẽ nhận vào một tham số là câu truy vấn SQL cần được thực thi. Câu truy vấn SQL được truyền vào làm tham số sẽ thuộc kiểu dữ liệu String.
cur.execute("SELECT * FROM emp")
5. Tìm nạp dữ liệu
Khi truy vấn đã được thực thi, chúng ta có thể thu thập các kết quả của truy vấn này bằng phương thức fetchall(). Phương thức này không nhận vào tham số nào, và trả về kết quả của các câu truy vấn Select.
res = cur.fetchall()
Kết quả của câu truy vấn này sẽ được lưu trữ bên trong biến res.
6. Kết hợp tất cả lại với nhau
Khi đã tạo xong cơ sở dữ liệu trong PostgreSQL, chúng ta có thể truy cập tới cơ sở dữ liệu đó, trong Python. Đầu tiên, ta tạo ra một bảng emp trong cơ sở dữ liệu test với lược đồ: (id INTEGER PRIMARY KEY, name VARCHAR(10), salary INT, dept INT). Khi bảng emp được tạo thành công, chúng ta sẽ có thể thêm các giá trị dưới dạng một bản ghi dữ liệu (data record) vào trong bảng này.
Khi bản ghi dữ liệu đã được thêm vào bảng, chúng ta có thể truy vấn bảng emp để lấy ra tất cả các hàng của bảng emp, để hiển thị cho người dùng bằng cách sử dụng hàm fetchall().
# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Group: https://www.facebook.com/groups/cafedev.vn/
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
#Pinterest: https://www.pinterest.com/cafedevvn/
#YouTube: https://www.youtube.com/channel/UCE7zpY_SlHGEgo67pHxqIoA/
# -----------------------------------------------------------
# importing libraries
import psycopg2
# a function to connect to
# the database.
def connect():
# connecting to the database called test
# using the connect function
try:
conn = psycopg2.connect(database ="test",
user = "adith",
password = "password",
host = "localhost",
port = "5432")
# creating the cursor object
cur = conn.cursor()
except (Exception, psycopg2.DatabaseError) as error:
print ("Error while creating PostgreSQL table", error)
# returing the conn and cur
# objects to be used later
return conn, cur
# a function to create the
# emp table.
def create_table():
# connect to the database.
conn, cur = connect()
try:
# the test database contains a table called emp
# the schema : (id INTEGER PRIMARY KEY,
# name VARCHAR(10), salary INT, dept INT)
# create the emp table
cur.execute('CREATE TABLE emp (id INT PRIMARY KEY, name VARCHAR(10),
salary INT, dept INT)')
# the commit function permanently
# saves the changes made to the database
# the rollback() function can be used if
# there are any undesirable changes and
# it simply undoes the changes of the
# previous query
except:
print('error')
conn.commit()
# a function to insert data
# into the emp table
def insert_data(id = 1, name = '', salary = 1000, dept = 1):
conn, cur = connect()
try:
# inserting values into the emp table
cur.execute('INSERT INTO emp VALUES(%s, %s, %s, %s)',
(id, name, salary, dept))
except Exception as e:
print('error', e)
# commiting the transaction.
conn.commit()
# a function to fetch the data
# from the table
def fetch_data():
conn, cur = connect()
# select all the rows from emp
try:
cur.execute('SELECT * FROM emp')
except:
print('error !')
# store the result in data
data = cur.fetchall()
# return the result
return data
# a function to print the data
def print_data(data):
print('Query result: ')
print()
# iterating over all the
# rows in the table
for row in data:
# printing the columns
print('id: ', row[0])
print('name: ', row[1])
print('salary: ', row[2])
print('dept: ', row[3])
print('----------------------------------')
# function to delete the table
def delete_table():
conn, cur = connect()
# delete the table
try:
cur.execute('DROP TABLE emp')
except Exception as e:
print('error', e)
conn.commit()
# driver function
if __name__ == '__main__':
# create the table
create_table()
# inserting some values
insert_data(1, 'adith', 1000, 2)
insert_data(2, 'tyrion', 100000, 2)
insert_data(3, 'jon', 100, 3)
insert_data(4, 'daenerys', 10000, 4)
# getting all the rows
data = fetch_data()
# printing the rows
print_data(data)
# deleting the table
# once we are done with
# the program
delete_table()
Nguồn và Tài liệu tiếng anh tham khảo:
Tài liệu từ cafedev:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!