Cách sử dụng module sqlite3 trong Python 3
SQLite là một database SQL dựa trên file , độc lập. SQLite đi kèm với Python và được dùng trong bất kỳ ứng dụng Python nào của bạn mà không cần phải cài đặt bất kỳ phần mềm bổ sung nào. Trong hướng dẫn này, ta sẽ xem xét mô-đun sqlite3
trong Python 3 . Ta sẽ tạo kết nối đến database SQLite, thêm bảng vào database đó, chèn dữ liệu vào bảng đó, đọc và sửa đổi dữ liệu trong bảng đó.
Đối với hướng dẫn này, ta sẽ làm việc chủ yếu với danh mục cá mà ta cần sửa đổi khi cá được thêm vào hoặc xóa khỏi bể cá hư cấu.
Yêu cầu
Để tận dụng tối đa hướng dẫn này, bạn nên làm quen với lập trình bằng Python và một số kiến thức cơ bản về SQL.
Bạn có thể xem lại các hướng dẫn này để biết thông tin cơ bản cần thiết:
Bước 1 - Tạo kết nối với database SQLite
Khi ta kết nối với database SQLite, ta đang truy cập dữ liệu cuối cùng nằm trong một file trên máy tính của ta . Database SQLite là công cụ SQL có đầy đủ tính năng được dùng cho nhiều mục đích. Hiện tại, ta sẽ xem xét một database theo dõi số lượng cá tại một bể cá giả tưởng.
Ta có thể kết nối với database SQLite bằng module Python sqlite3
:
import sqlite3 connection = sqlite3.connect("aquarium.db")
import sqlite3
cấp cho chương trình Python của ta quyền truy cập vào module sqlite3
. Hàm sqlite3.connect()
trả về một đối tượng Connection
mà ta sẽ sử dụng để tương tác với database SQLite được giữ trong file aquarium.db
Các aquarium.db
file được tạo ra tự động bởi sqlite3.connect()
nếu aquarium.db
không tồn tại trên máy tính của ta .
Ta có thể xác minh ta đã tạo thành công đối tượng connection
của bạn bằng lệnh:
print(connection.total_changes)
Nếu ta chạy mã Python này, ta sẽ thấy kết quả như:
Output0
connection.total_changes
là tổng số hàng database đã được thay đổi theo connection
. Vì ta chưa thực hiện bất kỳ lệnh SQL nào nên 0 total_changes
là chính xác.
Nếu bất cứ lúc nào, ta thấy mình muốn bắt đầu lại hướng dẫn này, ta có thể xóa file aquarium.db
khỏi máy tính của bạn .
Lưu ý: Cũng có thể kết nối với database SQLite nằm hoàn toàn trong bộ nhớ (chứ không phải trong file ) bằng cách chuyển chuỗi đặc biệt ":memory:"
vào sqlite3.connect()
. Ví dụ: sqlite3.connect(":memory:")
. A ":memory:"
Database SQLite sẽ không xuất hiện ngay khi chương trình Python của bạn thoát. Điều này có thể thuận tiện nếu bạn muốn một sandbox tạm thời để thử một cái gì đó trong SQLite và không cần lưu giữ bất kỳ dữ liệu nào sau khi chương trình của bạn thoát.
Bước 2 - Thêm dữ liệu vào database SQLite
Bây giờ ta đã kết nối với aquarium.db
database SQLite, ta có thể bắt đầu chèn và đọc dữ liệu từ nó.
Trong database SQL, dữ liệu được lưu trữ trong các bảng. Các bảng xác định một tập hợp các cột và chứa 0 hoặc nhiều hàng với dữ liệu cho mỗi cột được xác định.
Ta sẽ tạo một bảng có tên fish
để theo dõi các dữ liệu sau:
Tên | loài | tank_number |
---|---|---|
Sammy | cá mập | 1 |
Jamie | mực nang | 7 |
Bảng fish
sẽ theo dõi giá trị cho name
, species
và số tank_number
cho mỗi con cá trong bể cá. Hai hàng fish
ví dụ được liệt kê: một hàng cho shark
tên là Sammy
và một hàng cho cuttlefish
tên là Jamie
.
Ta có thể tạo bảng fish
này trong SQLite bằng cách sử dụng connection
mà ta đã thực hiện ở Bước 1:
cursor = connection.cursor() cursor.execute("CREATE TABLE fish (name TEXT, species TEXT, tank_number INTEGER)")
connection.cursor()
trả về một đối tượng Cursor
. Cursor
đối tượng Cursor
cho phép ta gửi các câu lệnh SQL đến database SQLite bằng cách sử dụng cursor.execute()
. Chuỗi "CREATE TABLE fish ..."
là một câu lệnh SQL tạo một bảng có tên fish
với ba cột được mô tả trước đó: name
của loại TEXT
, loài thuộc loại TEXT
và tank_number
của loại INTEGER
.
Bây giờ ta đã tạo một bảng, ta có thể chèn các hàng dữ liệu vào đó:
cursor.execute("INSERT INTO fish VALUES ('Sammy', 'shark', 1)") cursor.execute("INSERT INTO fish VALUES ('Jamie', 'cuttlefish', 7)")
Ta gọi cursor.execute()
hai lần: một lần để chèn một hàng cho cá mập Sammy
trong bể 1
và một lần để chèn một hàng cho mực nang Jamie
trong bể 7
. "INSERT INTO fish VALUES ..."
là một câu lệnh SQL cho phép ta thêm các hàng vào một bảng.
Trong phần tiếp theo, ta sẽ sử dụng câu lệnh SQL SELECT
để kiểm tra các hàng mà ta vừa chèn vào bảng fish
.
Bước 3 - Đọc dữ liệu từ database SQLite
Trong Bước 2, ta đã thêm hai hàng vào bảng SQLite có tên là fish
. Ta có thể truy xuất các hàng đó bằng SELECT
SQL:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows)
Nếu ta chạy mã này, ta sẽ thấy kết quả như sau:
Output[('Sammy', 'shark', 1), ('Jamie', 'cuttlefish', 7)]
Hàm cursor.execute()
chạy SELECT
để truy xuất giá trị cho các cột name
, species
và tank_number
trong bảng fish
. fetchall()
truy xuất tất cả các kết quả của SELECT
. Khi ta print(rows)
ta thấy một danh sách gồm hai bộ giá trị. Mỗi bộ có ba mục nhập; một mục nhập cho mỗi cột ta đã chọn từ bảng fish
. Hai bộ giá trị có dữ liệu mà ta đã chèn trong Bước 2: một bộ cho shark
Sammy
và một bộ cho cuttlefish
Jamie
.
Nếu ta muốn truy xuất các hàng trong bảng fish
phù hợp với một bộ tiêu chí cụ thể, ta có thể sử dụng WHERE
:
target_fish_name = "Jamie" rows = cursor.execute( "SELECT name, species, tank_number FROM fish WHERE name = ?", (target_fish_name,), ).fetchall() print(rows)
Nếu ta chạy điều này, ta sẽ thấy kết quả như sau:
Output[('Jamie', 'cuttlefish', 7)]
Như với ví dụ trước, cursor.execute(<SQL statement>).fetchall()
cho phép ta tìm nạp tất cả các kết quả của một SELECT
. WHERE
trong SELECT
lọc các hàng có giá trị của name
là target_fish_name
. Chú ý rằng ta sử dụng ?
để thay thế biến target_fish_name
của ta vào SELECT
. Ta dự kiến sẽ chỉ khớp một hàng và thực sự ta chỉ thấy hàng dành cho Jamie
mà cuttlefish
trả lại.
Cảnh báo: Không bao giờ sử dụng các phép toán chuỗi Python để tạo động một chuỗi câu lệnh SQL. Sử dụng các hoạt động chuỗi Python để tập hợp một chuỗi câu lệnh SQL khiến bạn dễ bị tấn công SQL injection . Các cuộc tấn công SQL injection được dùng để ăn cắp, thay đổi hoặc sửa đổi dữ liệu được lưu trữ trong database của bạn. Luôn sử dụng dấu ?
trình giữ chỗ trong câu lệnh SQL của bạn để thay thế động các giá trị từ chương trình Python của bạn. Cursor.execute()
một bộ giá trị làm đối số thứ hai cho Cursor.execute()
để liên kết các giá trị của bạn với câu lệnh SQL. Mô hình thay thế này cũng được trình bày ở đây và trong các phần khác của hướng dẫn này.
Bước 4 - Sửa đổi dữ liệu trong database SQLite
Các hàng trong database SQLite có thể được sửa đổi bằng cách sử dụng câu lệnh SQL UPDATE
và DELETE
.
Ví dụ, giả sử rằng con cá mập Sammy đã được chuyển đến bể số 2. Ta có thể thay đổi hàng của Sammy trong bảng fish
để phản ánh sự thay đổi này:
new_tank_number = 2 moved_fish_name = "Sammy" cursor.execute( "UPDATE fish SET tank_number = ? WHERE name = ?", (new_tank_number, moved_fish_name) )
Ta đưa ra câu lệnh UPDATE
SQL để thay đổi tank_number
của Sammy
thành giá trị mới của nó là 2
. WHERE
trong câu lệnh UPDATE
đảm bảo ta chỉ thay đổi giá trị của tank_number
nếu một hàng có name = "Sammy"
.
Nếu ta chạy SELECT
sau, ta có thể xác nhận bản cập nhật của ta đã được thực hiện chính xác:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows)
Nếu ta chạy điều này, ta sẽ thấy kết quả như sau:
Output[('Sammy', 'shark', 2), ('Jamie', 'cuttlefish', 7)]
Lưu ý hàng cho Sammy
bây giờ có giá trị là 2
cho cột tank_number
của nó.
Giả sử rằng con cá mập Sammy đã được thả vào tự nhiên và không còn được giữ trong bể cá nữa. Vì Sammy không còn sống ở thủy cung, nên việc loại bỏ hàng Sammy
khỏi bàn fish
hợp lý.
Phát hành câu lệnh SQL DELETE
để xóa một hàng:
released_fish_name = "Sammy" cursor.execute( "DELETE FROM fish WHERE name = ?", (released_fish_name,) )
Ta đưa ra câu lệnh DELETE
SQL để xóa hàng cho Sammy
the shark
. WHERE
trong câu DELETE
đảm bảo ta chỉ xóa một hàng nếu hàng đó có name = "Sammy"
.
Nếu ta chạy SELECT
sau, ta có thể xác nhận việc xóa của ta đã được thực hiện chính xác:
rows = cursor.execute("SELECT name, species, tank_number FROM fish").fetchall() print(rows)
Nếu ta chạy mã này, ta sẽ thấy kết quả như sau:
Output[('Jamie', 'cuttlefish', 7)]
Lưu ý hàng dành cho shark
Sammy
đã không còn, và chỉ còn lại cuttlefish
Jamie
.
Bước 5 - Sử dụng with
câu lệnh để tự động dọn dẹp
Trong hướng dẫn này, ta đã sử dụng hai đối tượng chính để tương tác với database SQLite "aquarium.db"
aqua.db "aquarium.db"
: đối tượng Connection
có tên là connection
và đối tượng Cursor
có tên là cursor
.
Tương tự như cách mà các file Python nên được đóng khi ta làm việc xong với chúng, các đối tượng Connection
và Cursor
cũng nên được đóng khi chúng không còn cần thiết nữa.
Ta có thể sử dụng câu lệnh with
để giúp ta tự động đóng các đối tượng Connection
và Cursor
:
from contextlib import closing with closing(sqlite3.connect("aquarium.db")) as connection: with closing(connection.cursor()) as cursor: rows = cursor.execute("SELECT 1").fetchall() print(rows)
closing
là một chức năng tiện lợi được cung cấp bởi mô-đun contextlib
. Khi câu lệnh with
thoát ra, closing
đảm bảo close()
được gọi trên bất kỳ đối tượng nào được chuyển đến nó. Hàm closing
được sử dụng hai lần trong ví dụ này. Một lần đảm bảo rằng các Connection
đối tượng được trả về bởi sqlite3.connect()
được tự động đóng lại, và lần thứ hai đảm bảo rằng các Cursor
đối tượng được trả về bởi connection.cursor()
được tự động đóng lại.
Nếu ta chạy mã này, ta sẽ thấy kết quả như sau:
Output[(1,)]
Vì "SELECT 1"
là một câu lệnh SQL luôn trả về một hàng với một cột duy nhất có giá trị là 1
, nên xem một bộ giá trị duy nhất với 1
là giá trị duy nhất được trả về bởi mã của ta .
Kết luận
Mô-đun sqlite3
là một phần mạnh mẽ của thư viện chuẩn Python; nó cho phép ta làm việc với database SQL trên đĩa đầy đủ tính năng mà không cần cài đặt bất kỳ phần mềm bổ sung nào.
Trong hướng dẫn này, ta đã học cách sử dụng module sqlite3
để kết nối với database SQLite, thêm dữ liệu vào database đó, cũng như đọc và sửa đổi dữ liệu trong database đó. Đồng thời, ta cũng đã tìm hiểu về các rủi ro của các cuộc tấn công SQL injection và cách sử dụng contextlib.closing
để tự động gọi hàm close()
trên các đối tượng Python with
câu lệnh.
Từ đây ta có thể tìm hiểu thêm về database SQL trong SQLite so với MySQL và PostgreSQL: So sánh các hệ thống quản lý database quan hệ .
Các tin liên quan
Cách thiết lập notebook Jupyter với Python 3 trên Ubuntu 20.04 và Kết nối qua Đường hầm SSH2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04 [Khởi động nhanh]
2020-05-19
Cách cài đặt Phân phối Python Anaconda trên Ubuntu 20.04
2020-05-06
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 20.04
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên server Ubuntu 18.04
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên Ubuntu 20.04 [Quickstart]
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên Ubuntu 18.04 [Quickstart]
2020-04-24
Cách cài đặt Python 3 và thiết lập môi trường lập trình trên CentOS 8
2020-04-10
Cách bắt đầu với Python trong Visual Studio Code
2020-04-09
Cách bắt đầu với Thư viện yêu cầu bằng Python
2020-01-29