Truy cập MySQL Database trong Python



Chương này sẽ giới thiệu khái quát cho bạn về cách truy cập Database bởi sử dụng Python và giới thiệu qua về một số hoạt động cơ bản trên Database như INSERT, UPDATE, DELETE ...

Trước khi theo dõi và thực hành chương này, bạn cần phải tải một DB API Module riêng cho mỗi Database bạn cần truy cập. DB API cung cấp một chuẩn tối thiểu để làm việc với Database bởi sử dụng Python. Trong chương này, chúng ta sẽ sử dụng MySQL, vì thế trước hết chúng ta hãy tìm hiểu qua về MySQLdb Module.

MySQLdb là gì?

MySQLdb là một Interface để kết nối tới một MySQL Database Server từ Python. Nó triển khai Python Database API 2.0 và được xây dựng trên cùng của MySQL C API.

Cách cài đặt MySQLdb?

Trước khi tiến hành, bạn cần cài đặt MySQL trên thiết bị của bạn. Sau đó gõ dòng Python script sau và thực thi nó:

 import MySQLdb

Nếu nó cho kết quả sau, thì nghĩa là MySQLdb Module đã không được cài đặt:

Traceback (most recent call last):
  File "test.py", line 3, in 
    import MySQLdb
ImportError: No module named MySQLdb

Để cài đặt MySQLdb Module, tải nó từ MySQLdb Download và tiến hành như sau:

$ gunzip MySQL-python-1.2.2.tar.gz
$ tar -xvf MySQL-python-1.2.2.tar
$ cd MySQL-python-1.2.2
$ python setup.py build
$ python setup.py install

Kết nối Database trong Python

Trước khi kết nối với một MySQL Database, đảm bảo:

  • Bạn đã tạo một Database có tên là TESTDB.

  • Bạn đã tạo một bảng là SINHVIEN trong TESTDB.

  • Bảng này có các trường HO, TEN, TUOI, GIOITINH và HOCPHI

  • User ID là testuser và password là test123 được thiết lập để truy cập TESTDB.

  • MySQLdb Module được cài đặt phù hợp trên thiết bị của bạn.

  • Bạn đã hiểu cơ bản về MySQL, nếu chưa, bạn có thể tham khảo Bài hướng dẫn MySQL.

Dưới đây là ví dụ về kết nối với TESTDB.

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Thuc thi truy van SQL boi su dung phuong thuc execute().
cursor.execute("SELECT VERSION()")# Lay mot hang boi su dung phuong thuc fetchone().
data = cursor.fetchone()print "Database version : %s " % data# ngat ket noi voi server
db.close()

Khi chạy script này, nó sẽ cho kết quả sau trên thiết bị Linux.

Database version : 5.0.45

Nếu một kết nối được thành lập, thì một đối tượng Connection được trả về và được lưu giữ vào trong db, nếu không db được thiết lập là None. Tiếp đó, đối tượng db được sử dụng để tạo đối tượng cursor, mà tiếp đó được sử dụng để thực thi các truy vấn SQL. Cuối cùng, trước khi thoát ra, nó bảo đảm rằng kết nối tới Database được đóng và các resource được giải phóng.

Tạo bảng dữ liệu trong Python

Khi một kết nối tới Database đã được thành lập, chúng ta có thể tạo các bảng hoặc bản ghi vào trong bảng đó bởi sử dụng phương thức execute của đối tượng cursor đã được tạo.

Bạn theo dõi ví dụ để tạo bảng SINHVIEN:

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Xoa bang neu no da ton tai boi su dung phuong thuc execute().
cursor.execute("DROP TABLE IF EXISTS SINHVIEN")# Tao mot bang
sql = """CREATE TABLE SINHVIEN (
         HO  CHAR(20) NOT NULL,
         TEN  CHAR(20),
         TUOI INT,  
         GIOITINH CHAR(1),
         HOCPHI FLOAT )"""cursor.execute(sql)# ngat ket noi voi server
db.close()

Hoạt động INSERT trong Python

Đây là hoạt động bắt buộc khi bạn muốn tạo các bản ghi vào trong bảng đã tạo.

Ví dụ sau sẽ thực thi lệnh SQL INSERT để tạo một bản ghi vào trong bảng SINHVIEN.

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Truy van SQL de INSERT mot ban ghi vao trong database.
sql = """INSERT INTO SINHVIEN(HO,
         TEN, TUOI, GIOITINH, HOCPHI)
         VALUES ('Nguyen', 'Hoang', 20, 'M', 4000000)"""
try:
   # Thuc thi lenh SQL
   cursor.execute(sql)
   # Commit cac thay doi vao trong Database
   db.commit()
except:
   # Rollback trong tinh huong co bat ky error nao
   db.rollback()# ngat ket noi voi server
db.close()

Ví dụ trên có thể được viết như sau để tạo các truy vấn SQL hay hơn:

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Truy van SQL de INSERT mot ban ghi vao trong database.
sql = "INSERT INTO SINHVIEN(HO, \
       TEN, TUOI, GIOITINH, HOCPHI) \
       VALUES ('%s', '%s', '%d', '%c', '%d' )" % \
       ('Nguyen', 'Hoang', 20, 'M', 4000000)
try:
   # Thuc thi lenh SQL
   cursor.execute(sql)
   # Commit cac thay doi vao trong Database
   db.commit()
except:
   # Rollback trong tinh huong co bat ky error nao
   db.rollback()# ngat ket noi voi server
db.close()

Ví dụ

Đoạn code sau là form thực thi khác, tại đây bạn có thể truyền các tham số một cách trực tiếp.

..................................
user_id = "test123"
password = "password"con.execute('chen cac gia tri de dang nhap ("%s", "%s")' % \
             (user_id, password))
..................................

Hoạt động đọc trong Python

Hoạt động đọc trên bất cứ Database nào nghĩa là lấy một số thông tin hữu ích từ Database.

Khi kết nối với Databse được thiết lập, bạn có thể tạo một truy vấn vào trong Database này. Bạn có thể sử dụng hoặc phương thức fetchone() để lấy bản ghi đơn hoặc phương thức fetchall() để lấy nhiều giá trị từ một bảng.

  • Hàm fetchone() lấy hàng tiếp theo của một tập kết quả truy vấn. Một tập kết quả là một đối tượng được trả về khi một đối tượng cursor được sử dụng để truy vấn một bảng.

  • Hàm fetchall() lấy tất cả các hàng trong một tập kết quả. Nếu một số hàng đã sẵn sàng được trích từ tập kết quả đó, thì nó thu nhận các hàng còn lại từ tập kết quả.

  • Thuộc tính rowcount là một thuộc tính read-only và trả về số hằng đã bị ảnh hưởng bởi phương thức execute().

Ví dụ sau truy vấn tất cả bản ghi từ bảng SINHVIEN mà có salary lớn hơn 1000:

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Chuan bi truy van SQl de INSERT mot ban ghi vao trong database.
sql = "SELECT * FROM SINHVIEN \
       WHERE HOCPHI > '%d'" % (1000)
try:
   # Thuc thi lenh SQL
   cursor.execute(sql)
   # Lay tat ca cac hang trong list.
   results = cursor.fetchall()
   for row in results:
      ho = row[0]
      ten = row[1]
      tuoi = row[2]
      gioitinh = row[3]
      hocphi = row[4]
      # Bay gio in ket qua
      print "ho=%s,ten=%s,tuoi=%d,gioitinh=%s,hocphi=%d" % \
             (ho, ten, tuoi, gioitinh, hocphi )
except:
   print "Error: khong lay duoc du lieu"# ngat ket noi voi server
db.close()

Kết quả là:

ho=Nguyen, ten=Hoang, tuoi=20, gioitinh=M, hocphi=4000000

Hoạt động Update trong Python

Hoạt động UPDATE trên bất cứ Database nào nghĩa là để cập nhật một hoặc nhiều bản ghi mà đã có sẵn trong Database.

Thủ tục sau cập nhật tất cả bản ghi có GIOITINH là M. Ở đây, chúng ta tăng tất cả TUOI của male thêm 1 năm.

Ví dụ

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Truy van SQL de UPDATE cac ban ghi
sql = "UPDATE SINHVIEN SET TUOI = TUOI + 1
                          WHERE GIOITINH = '%c'" % ('M')
try:
   # Thuc thi lenh SQL
   cursor.execute(sql)
   # Commit cac thay doi vao trong Database
   db.commit()
except:
   # Rollback trong tinh huong co bat ky error nao
   db.rollback()# ngat ket noi voi server
db.close()

Hoạt động DELETE trong Python

Hoạt động DELETE là cần thiết khi bạn muốn xóa một số bản ghi từ Database. Dưới đây là thủ tục để xóa tất cả bản ghi từ bảng SINHVIEN với điều kiện là TUOI lớn hơn 20:

Ví dụ

 import MySQLdb# mo ket noi toi Database
db = MySQLdb.connect("localhost","testuser","test123","TESTDB" )# chuan bi mot doi tuong cursor boi su dung phuong thuc cursor()
cursor = db.cursor()# Chuan bi truy van SQL de DELETE cac ban ghi can thiet
sql = "DELETE FROM SINHVIEN WHERE TUOI > '%d'" % (20)
try:
   # Thuc thi lenh SQL
   cursor.execute(sql)
   # Commit cac thay doi vao trong Database
   db.commit()
except:
   # Rollback trong tinh huong co bat ky error nao
   db.rollback()# ngat ket noi voi server
db.close()

Ngắt kết nối tới Database trong Python

Để ngắt kết nối tới Database, bạn sử dụng phương thức close(), có cú pháp như sau:

 db.close()