Độ bền dữ liệu Python - Mô-đun Sqlite3
Một nhược điểm lớn của các tệp CSV, JSON, XML, v.v., là chúng không hữu ích lắm cho việc truy cập ngẫu nhiên và xử lý giao dịch vì bản chất chúng phần lớn không có cấu trúc. Do đó, rất khó sửa đổi nội dung.
Các tệp phẳng này không phù hợp với môi trường máy khách-máy chủ vì chúng thiếu khả năng xử lý không đồng bộ. Sử dụng các tệp dữ liệu không có cấu trúc dẫn đến dư thừa và không nhất quán dữ liệu.
Những vấn đề này có thể được khắc phục bằng cách sử dụng cơ sở dữ liệu quan hệ. Cơ sở dữ liệu là một tập hợp dữ liệu có tổ chức để loại bỏ sự dư thừa và không nhất quán, đồng thời duy trì tính toàn vẹn của dữ liệu. Mô hình cơ sở dữ liệu quan hệ rất phổ biến.
Khái niệm cơ bản của nó là sắp xếp dữ liệu trong bảng thực thể (gọi là quan hệ). Cấu trúc bảng thực thể cung cấp một thuộc tính có giá trị là duy nhất cho mỗi hàng. Một thuộc tính như vậy được gọi là'primary key'.
Khi khóa chính của một bảng xuất hiện trong cấu trúc của các bảng khác, nó được gọi là 'Foreign key'và điều này tạo thành cơ sở của mối quan hệ giữa hai người. Dựa trên mô hình này, hiện có nhiều sản phẩm RDBMS phổ biến -
- GadFly
- mSQL
- MySQL
- PostgreSQL
- Microsoft SQL Server 2000
- Informix
- Interbase
- Oracle
- Sybase
- SQLite
SQLite là một cơ sở dữ liệu quan hệ nhẹ được sử dụng trong nhiều ứng dụng. Nó là một công cụ cơ sở dữ liệu SQL giao dịch độc lập, không máy chủ, không cấu hình, không giao dịch. Toàn bộ cơ sở dữ liệu là một tệp duy nhất, có thể được đặt ở bất kỳ đâu trong hệ thống tệp. Đó là một phần mềm mã nguồn mở, với kích thước rất nhỏ và cấu hình bằng không. Nó được sử dụng phổ biến trong các thiết bị nhúng, IOT và ứng dụng di động.
Tất cả các cơ sở dữ liệu quan hệ sử dụng SQL để xử lý dữ liệu trong bảng. Tuy nhiên, trước đó, mỗi cơ sở dữ liệu này đã từng được kết nối với ứng dụng Python với sự trợ giúp của mô-đun Python cụ thể cho loại cơ sở dữ liệu.
Do đó, thiếu sự tương thích giữa chúng. Nếu người dùng muốn thay đổi sang sản phẩm cơ sở dữ liệu khác, điều đó sẽ chứng tỏ là khó. Vấn đề không tương thích này đã được giải quyết bằng cách nêu ra 'Đề xuất cải tiến Python (PEP 248)' để đề xuất giao diện nhất quán cho cơ sở dữ liệu quan hệ được gọi là DB-API. Các đề xuất mới nhất được gọi làDB-APIPhiên bản 2.0. (PEP 249)
Thư viện chuẩn của Python bao gồm mô-đun sqlite3 là mô-đun tuân thủ DB-API để xử lý cơ sở dữ liệu SQLite thông qua chương trình Python. Chương này giải thích kết nối của Python với cơ sở dữ liệu SQLite.
Như đã đề cập trước đó, Python đã hỗ trợ sẵn cho cơ sở dữ liệu SQLite ở dạng mô-đun sqlite3. Đối với các cơ sở dữ liệu khác, mô-đun Python tương ứng với DB-API sẽ phải được cài đặt với sự trợ giúp của tiện ích pip. Ví dụ, để sử dụng cơ sở dữ liệu MySQL, chúng ta cần cài đặt mô-đun PyMySQL.
pip install pymysql
Các bước sau được khuyến nghị trong DB-API -
Thiết lập kết nối với cơ sở dữ liệu bằng cách sử dụng connect() chức năng và lấy đối tượng kết nối.
Gọi cursor() phương thức kết nối đối tượng để lấy đối tượng con trỏ.
Tạo một chuỗi truy vấn tạo thành một câu lệnh SQL sẽ được thực thi.
Thực thi truy vấn mong muốn bằng cách gọi execute() phương pháp.
Đóng kết nối.
import sqlite3
db=sqlite3.connect('test.db')
Ở đây, db là đối tượng kết nối đại diện cho test.db. Lưu ý, cơ sở dữ liệu đó sẽ được tạo nếu nó chưa tồn tại. Đối tượng kết nối db có các phương thức sau:
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | cursor(): Trả về một đối tượng Con trỏ sử dụng Kết nối này. |
2 | commit(): Cam kết rõ ràng mọi giao dịch đang chờ xử lý vào cơ sở dữ liệu. |
3 | rollback(): Phương thức tùy chọn này khiến giao dịch được quay trở lại điểm bắt đầu. |
4 | close(): Đóng kết nối với cơ sở dữ liệu vĩnh viễn. |
Một con trỏ hoạt động như một bộ xử lý cho một truy vấn SQL nhất định cho phép truy xuất một hoặc nhiều hàng của kết quả. Đối tượng con trỏ được lấy từ kết nối để thực hiện các truy vấn SQL bằng cách sử dụng câu lệnh sau:
cur=db.cursor()
Đối tượng con trỏ có các phương thức sau được định nghĩa:
Sr.No | Phương pháp & Mô tả |
---|---|
1 | execute() Thực thi truy vấn SQL trong một tham số chuỗi. |
2 | executemany() Thực thi truy vấn SQL bằng cách sử dụng một tập hợp các tham số trong danh sách các bộ giá trị. |
3 | fetchone() Tìm nạp hàng tiếp theo từ tập kết quả truy vấn. |
4 | fetchall() Tìm nạp tất cả các hàng còn lại từ tập kết quả truy vấn. |
5 | callproc() Gọi một thủ tục được lưu trữ. |
6 | close() Đóng đối tượng con trỏ. |
Mã sau tạo một bảng trong test.db: -
import sqlite3
db=sqlite3.connect('test.db')
cur =db.cursor()
cur.execute('''CREATE TABLE student (
StudentID INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT (20) NOT NULL,
age INTEGER,
marks REAL);''')
print ('table created successfully')
db.close()
Tính toàn vẹn dữ liệu mong muốn trong cơ sở dữ liệu đạt được bằng commit() và rollback()các phương thức của đối tượng kết nối. Chuỗi truy vấn SQL có thể có một truy vấn SQL không chính xác có thể tạo ra một ngoại lệ, cần được xử lý đúng cách. Vì vậy, câu lệnh execute () được đặt trong khối try Nếu nó thành công, kết quả được lưu liên tục bằng phương thức commit (). Nếu truy vấn không thành công, giao dịch sẽ được hoàn tác bằng phương thức rollback ().
Mã sau thực hiện truy vấn CHÈN trên bảng sinh viên trong test.db.
import sqlite3
db=sqlite3.connect('test.db')
qry="insert into student (name, age, marks) values('Abbas', 20, 80);"
try:
cur=db.cursor()
cur.execute(qry)
db.commit()
print ("record added successfully")
except:
print ("error in query")
db.rollback()
db.close()
Nếu bạn muốn dữ liệu trong mệnh đề giá trị của truy vấn INSERT được cung cấp động bởi đầu vào của người dùng, hãy sử dụng thay thế tham số như được khuyến nghị trong Python DB-API. Các ? ký tự được sử dụng như một trình giữ chỗ trong chuỗi truy vấn và cung cấp các giá trị dưới dạng một bộ giá trị trong phương thức execute (). Ví dụ sau đây chèn một bản ghi bằng phương pháp thay thế tham số. Tên, tuổi và nhãn hiệu được lấy làm đầu vào.
import sqlite3
db=sqlite3.connect('test.db')
nm=input('enter name')
a=int(input('enter age'))
m=int(input('enter marks'))
qry="insert into student (name, age, marks) values(?,?,?);"
try:
cur=db.cursor()
cur.execute(qry, (nm,a,m))
db.commit()
print ("one record added successfully")
except:
print("error in operation")
db.rollback()
db.close()
Mô-đun sqlite3 xác định executemany()phương pháp có thể thêm nhiều bản ghi cùng một lúc. Dữ liệu được thêm vào phải được cung cấp trong một danh sách các bộ, với mỗi bộ chứa một bản ghi. Đối tượng danh sách là tham số của phương thức thực thi () cùng với chuỗi truy vấn. Tuy nhiên, phương thức executeutemany () không được hỗ trợ bởi một số mô-đun khác.
Các UPDATEtruy vấn thường chứa một biểu thức logic được chỉ định bởi mệnh đề WHERE Chuỗi truy vấn trong phương thức execute () phải chứa cú pháp truy vấn CẬP NHẬT. Để cập nhật giá trị của 'age' thành 23 cho name = 'Anil', hãy xác định chuỗi như sau:
qry="update student set age=23 where name='Anil';"
Để làm cho quá trình cập nhật năng động hơn, chúng tôi sử dụng phương pháp thay thế tham số như mô tả ở trên.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
a=int(input(‘enter age’))
qry="update student set age=? where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (a, nm))
db.commit()
print("record updated successfully")
except:
print("error in query")
db.rollback()
db.close()
Tương tự, hoạt động DELETE được thực hiện bằng cách gọi phương thức execute () với một chuỗi có cú pháp truy vấn DELETE của SQL. Tình cờ,DELETE truy vấn cũng thường chứa một WHERE mệnh đề.
import sqlite3
db=sqlite3.connect('test.db')
nm=input(‘enter name’)
qry="DELETE from student where name=?;"
try:
cur=db.cursor()
cur.execute(qry, (nm,))
db.commit()
print("record deleted successfully")
except:
print("error in operation")
db.rollback()
db.close()
Một trong những hoạt động quan trọng trên bảng cơ sở dữ liệu là truy xuất các bản ghi từ nó. SQL cung cấpSELECTtruy vấn cho mục đích. Khi một chuỗi chứa cú pháp truy vấn SELECT được cung cấp cho phương thức execute (), một đối tượng tập hợp kết quả sẽ được trả về. Có hai phương thức quan trọng với đối tượng con trỏ bằng cách sử dụng một hoặc nhiều bản ghi từ tập kết quả có thể được truy xuất.
fetchone ()
Tìm nạp bản ghi có sẵn tiếp theo từ tập hợp kết quả. Nó là một bộ dữ liệu bao gồm các giá trị của mỗi cột của bản ghi được tìm nạp.
fetchall ()
Tìm nạp tất cả các bản ghi còn lại dưới dạng danh sách các bộ giá trị. Mỗi bộ tương ứng với một bản ghi và chứa các giá trị của mỗi cột trong bảng.
Ví dụ sau liệt kê tất cả các bản ghi trong bảng sinh viên
import sqlite3
db=sqlite3.connect('test.db')
37
sql="SELECT * from student;"
cur=db.cursor()
cur.execute(sql)
while True:
record=cur.fetchone()
if record==None:
break
print (record)
db.close()
Nếu bạn định sử dụng cơ sở dữ liệu MySQL thay vì cơ sở dữ liệu SQLite, bạn cần cài đặt PyMySQLmô-đun như đã mô tả ở trên. Tất cả các bước trong quy trình kết nối cơ sở dữ liệu đều giống nhau, vì cơ sở dữ liệu MySQL được cài đặt trên máy chủ, hàm connect () cần URL và thông tin đăng nhập.
import pymysql
con=pymysql.connect('localhost', 'root', '***')
Chỉ có điều có thể khác với SQLite là các kiểu dữ liệu cụ thể của MySQL. Tương tự, bất kỳ cơ sở dữ liệu tương thích ODBC nào cũng có thể được sử dụng với Python bằng cách cài đặt mô-đun pyodbc.