Trong các bài trước, chúng ta thấy rằng số lượng các bản ghi của cơ sở dữ liệu được đề cập trong các ví dụ được giới hạn ở mức tương đối ít, và các dữ liệu được tổ chức theo kiểu khá đơn giản. Ở bài này chúng ta sẽ cùng tìm hiểu về cách để ghi (write) và tìm nạp (fetch) dữ liệu lớn từ cơ sở dữ liệu bằng cách sử dụng module SQLite3.
Cách tìm nạp dữ liệu đơn giản nhất chính là thực thi câu truy vấn bằng hàm execute() và sau đó sử dụng hàm fetchall(). Điều này đã được đề cập trong bài “Thao tác với cơ sở dữ liệu trong Python – Phần 1”.
- Hàm executescript(): Đây là một phương thức tiện lợi giúp thực thi nhiều câu lệnh SQL cùng một lúc. Phương thức này sẽ thực thi các câu lệnh SQL mà nó nhận được dưới dạng tham số truyền vào.
+ Cú pháp:
sqlite3.connect.executescript(script)
+ Ví dụ:
# -----------------------------------------------------------
#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/
# -----------------------------------------------------------
import sqlite3
# Connection with the DataBase
# 'library.db'
connection = sqlite3.connect("library.db")
cursor = connection.cursor()
# SQL piece of code Executed
# SQL piece of code Executed
cursor.executescript("""
CREATE TABLE people(
firstname,
lastname,
age
);
CREATE TABLE book(
title,
author,
published
);
INSERT INTO
book(title, author, published)
VALUES (
'Dan Clarke''s GFG Detective Agency',
'Sean Simpsons',
1987
);
""")
sql = """
SELECT COUNT(*) FROM book;"""
cursor.execute(sql)
# The output in fetched and returned
# as a List by fetchall()
result = cursor.fetchall()
print(result)
sql = """
SELECT * FROM book;"""
cursor.execute(sql)
result = cursor.fetchall()
print(result)
# Changes saved into database
connection.commit()
# Connection closed(broken)
# with DataBase
connection.close()
+ Kết quả in ra là:
[(1,)]
[("Dan Clarke's GFG Detective Agency", 'Sean Simpsons', 1987)]
+ Lưu ý: Đoạn code ví dụ này có thể sẽ không hoạt động trên các trình thông dịch trực tuyến (online interpreters), do gặp vấn đề về sự cho phép các đặc quyền để tạo và ghi vào cơ sở dữ liệu.
- Hàm executemany(): Chúng ta sẽ gặp nhiều trường hợp mà trong đó, lượng dữ liệu lớn cần được thêm vào trong cơ sở dữ liệu thì nằm ở trong các Data Files (là các tập tin chứa dữ liệu, ngoài ra còn một số trường hợp đơn giản hơn có thể nhắc đến như List, array). Phương thức executemany() sẽ thực thi một câu lệnh SQL với tất cả các chuỗi tham số hoặc các ánh xạ tham số được tìm thấy trong chuỗi sql. Module sqlite3 còn cho phép sử dụng một iterator để cho phép sử dụng phương thức này với các tham số, thay vì một chuỗi các tham số. Nhưng việc sử dụng vòng lặp sẽ không phù hợp trong trường hợp này, ví dụ dưới dây sẽ cho thấy tại sao. Cú pháp và cách sử dụng phương thức executemany() sẽ được giải thích bên dưới, ngoài ra cách sử dụng nó như một vòng lặp cũng sẽ được trình bày.
+ Ví dụ:
# -----------------------------------------------------------
#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/
# -----------------------------------------------------------
import sqlite3
# Connection with the DataBase
# 'library.db'
connection = sqlite3.connect("library.db")
cursor = connection.cursor()
# SQL piece of code Executed
cursor.execute("""
CREATE TABLE book(
title,
author,
published);""")
List = [('A', 'B', 2008), ('C', 'D', 2008),
('E', 'F', 2010)]
connection. executemany("""
INSERT INTO
book(title, author, published)
VALUES (?, ?, ?)""", List)
sql = """
SELECT * FROM book;"""
cursor.execute(sql)
result = cursor.fetchall()
for x in result:
print(x)
# Changes saved into database
connection.commit()
# Connection closed(broken)
# with DataBase
connection.close()
+ Kết quả in ra là:
Traceback (most recent call last):
File "C:/Users/GFG/Desktop/SQLITE3.py", line 16, in
List[2][3] =[['A', 'B', 2008], ['C', 'D', 2008], ['E', 'F', 2010]]
NameError: name 'List' is not defined
+ Việc sử dụng hàm executemany() có thể làm cho đoạn code sau hoạt động:
import sqlite3
# Connection with the DataBase
# 'library.db'
connection = sqlite3.connect("library.db")
cursor = connection.cursor()
# SQL piece of code Executed
cursor.execute("""
CREATE TABLE book(
title,
author,
published);""")
List = [('A', 'B', 2008), ('C', 'D', 2008),
('E', 'F', 2010)]
connection. executemany("""
INSERT INTO
book(title, author, published)
VALUES (?, ?, ?)""", List)
sql = """
SELECT * FROM book;"""
cursor.execute(sql)
result = cursor.fetchall()
for x in result:
print(x)
# Changes saved into database
connection.commit()
# Connection closed(broken)
# with DataBase
connection.close()
+ Kết quả in ra là:
('A', 'B', 2008)
('C', 'D', 2008)
('E', 'F', 2010)
- Tìm nạp lượng dữ liệu lớn
+ Ví dụ:
# -----------------------------------------------------------
#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/
# -----------------------------------------------------------
import sqlite3
# Connection created with the
# database using sqlite3.connect()
connection = sqlite3.connect("company.db")
cursor = connection.cursor()
# Create Table command executed
sql = """
CREATE TABLE employee (
ID INTEGER PRIMARY KEY,
fname VARCHAR(20),
lname VARCHAR(30),
gender CHAR(1),
dob DATE);"""
cursor.execute(sql)
# Single Tuple inserted
sql = """
INSERT INTO employee
VALUES (1007, "Will", "Olsen", "M", "24-SEP-1865");"""
cursor.execute(sql)
# Multiple Rows inserted
List = [(1008, 'Rkb', 'Boss', 'M', "27-NOV-1864"),
(1098, 'Sak', 'Rose', 'F', "27-DEC-1864"),
(1908, 'Royal', 'Bassen', "F", "17-NOV-1894")]
connection. executemany(
"INSERT INTO employee VALUES (?, ?, ?, ?, ?)", List)
print("Method-1\n")
# Multiple Rows fetched from
# the Database
for row in connection.execute('SELECT * FROM employee ORDER BY ID'):
print (row)
print("\nMethod-2\n")
# Method-2 to fetch multiple
# rows
sql = """
SELECT * FROM employee ORDER BY ID;"""
cursor.execute(sql)
result = cursor.fetchall()
for x in result:
print(x)
connection.commit()
connection.close()
+ Kết quả in ra là:
Method-1
(1007, 'Will', 'Olsen', 'M', '24-SEP-1865')
(1008, 'Rkb', 'Boss', 'M', '27-NOV-1864')
(1098, 'Sak', 'Rose', 'F', '27-DEC-1864')
(1908, 'Royal', 'Bassen', 'F', '17-NOV-1894')
Method-2
(1007, 'Will', 'Olsen', 'M', '24-SEP-1865')
(1008, 'Rkb', 'Boss', 'M', '27-NOV-1864')
(1098, 'Sak', 'Rose', 'F', '27-DEC-1864')
(1908, 'Royal', 'Bassen', 'F', '17-NOV-1894')
+ Lưu ý: Đoạn code ví dụ này có thể sẽ không hoạt động trên các trình thông dịch trực tuyến (online interpreters), do gặp vấn đề về sự cho phép các đặc quyền để tạo và ghi vào cơ sở dữ liệu.
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!