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.

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:

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!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!