Connection MySQL
MySQL là một hệ cơ sở dữ liệu quan hệ phổ biến nhất hiện nay. Rất nhiều ngôn ngữ có thể kết nối đến MySQL và Python cũng không ngoại lệ.
Mặc định Python không có thư viện để kết nối đến MySQL server. Trong phần này, để kết nối đến MySQL Server từ Python, chúng ta sẽ sử dụng module MySQLdb.
Cài đặt MySQLdb
Cài đặt thông qua pip như sau:
$ sudo pip install MySQL-python
Tham khảo thêm tại: https://pypi.python.org/pypi/MySQL- python/1.2.5
Khai báo module MySQLdb là có thể sử dụng.
import MySQLdb
Trong một số trường hợp đã cài MySQLdb nhưng import báo lỗi thiếu file libmysqlclient.18.dylib
. Nguyên nhân có thể là do hiện tại đường dẫn đến file không tồn tại. Thử tạo symlink hoặc sử dụng câu lệnh sau để tạo symlink từ file libmysqlclient.18.dylib
đến thư mục /usr/lib/
$ sudo ln -s /usr/local/mysql/lib/libmysqlclient.18
.dylib /usr/lib/libmysqlclient.18.dylib
Kết nối đến MySQL Server
Bạn cần có một MySQL server đang chạy và cho kết nối đến. Trong trường hợp này là localhost nên không cần cấu hình đặc biệt, chỉ cần cung cấp username và password là có thể kết nối đến MySQL Server.
Thực hiện gọi hàm như sau để trả về kết nối:
import MySQLdb
dbcon = MySQLdb.connect(host = 'localhost', user = 'myusername', passwd = 'mypassword'
, db = 'mydbname')
Nếu kết nối không thành công thì sẽ báo lỗi và ngưng chương trình. Cách kết nối an toàn là đưa vào trong try
để bắt lỗi như sau:
import MySQLdb
db = None
try:
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'root', db = 'mysql')
except MySQLdb.Error, e:
print "Error %d: %s" % (e.args[0],e.args[1])
sys.exit(1)
if db:
cur = db.cursor()
cur.execute("SELECT VERSION()")
ver = cur.fetchone()
print "Database version : %s " % ver
Kết nối với charset utf8
Mặc định kết nối đến MySQL server là charset latin nên khi lấy dữ liệu unicode thì hiển thị Tiếng Việt không đúng, bạn cần phải chọn charset là utf8
khi tạo kết nối.
Cú pháp:
...
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'root', db = 'test', charset = 'utf8')
Query dữ liệu
Để truy vấn dữ liệu (chạy câu lệnh SQL) thì sử dụng cursor
của MySQLdb.
Ví dụ:
import MySQLdb
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'root', db = 'mysql');
cursor = db.cursor()
sql = 'SELECT * FROM user'
cursor.execute(sql)
myusers = cursor.fetchall()
Ví dụ dữ liệu biến myusers
là: ((1, 'John'), (2, 'Doe'))
.
Mặc định, cursor
sẽ trả về mỗi dòng dữ liệu từ MySQL theo kiểu tuple
, tức là không có key. Nếu bạn muốn trả về kiểu Dictionary
thì có thể khai báo:
import MySQLdb
db = MySQLdb.connect(host = 'localhost', user = 'root', passwd = 'root', db = 'mysql')
cursor = db.cursor(MySQLdb.cursors.DictCursor)
...
Fetch dữ liệu
Có một số cách để fetch
dữ liệu thông dụng từ cursor
sau khi đã exectute(sql)
là fetchone()
và fetchall()
.
fetchone()
Chỉ fetch một dòng dữ liệu. Nếu muốnfetch
nhiều dòng dữ liệu thì có thể gọi nhiều lần, mỗi lần sẽ trả về một dòng dữ liệu. Tốt cho trường hợp truy vấn rất nhiều dữ liệu một lúc. Nếu trả vềNone
tức là đãfetch
hết dữ liệu từ câu truy vấn.fetchall()
Fetch toàn bộ dữ liệu truy vấn được từ câu truy vấn và trả về mộttuple
chứa các dòng dữ liệu. Mỗi phần tử củaTuple
có thể là mộtTuple
khác hoặc là mộtDictionary
tùy theo cài đặt ở bước lấycursor
(Xem phần 9.4).fetchmany(size)
Nằm ở giữa 2 kiểufetch
trên, có thể quy định số lượng row trong mỗi lầnfetch
. Nếufetch
hết thì trả vềTuple
rỗng.
Đóng kết nối
Sau khi kết nối và truy vấn thì có thể đóng kết nối theo ví dụ sau:
Ví dụ:
import MySQLdb
db = MySQLdb.connect(...)
db.close()
Ngoài ra, bạn cũng nên đóng cursor
khi không còn sử dụng theo ví dụ:
Ví dụ:
import MySQLdb
db = MySQLdb.connect(...)
cursor = db.cursor()
cursor.close()
db.close()
Prepared Statement
Prepared statement là kỹ thuật tham số hóa các dữ liệu truyền vào câu truy vấn thay vì nối chuỗi trực tiếp để xây dựng một chuỗi truy vấn dài. Kỹ thuật này được áp dụng nhiều và giúp tăng hiệu quả và tính bảo mật của câu truy vấn.
Ví dụ:
...
cur.execute("UPDATE Writers SET Name = %s WHERE Id = %s", ("John", "4"))
...
Mỗi tham số truy vấn sẽ được thay thế bằng %s
và phương thức execute()
sẽ có tham số thứ 2 là một Tuple có giá trị tương ứng với thứ tự xuất hiện của các thành phần %s.
Follower me
Facebook: https://www.facebook.com/lamsaodecode
Last updated
Was this helpful?