Khóa học
MySQL là hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) sử dụng mô hình máy khách - máy chủ. Điều này có nghĩa là máy tính ("client") muốn truy cập dữ liệu phải kết nối tới máy chủ RDBMS để thực hiện.
Python, mặt khác, là một ngôn ngữ lập trình bậc cao, đa mục đích rất phổ biến. Nhà phát triển thường dùng để xây dựng website và phần mềm, tự động hóa tác vụ, và phân tích dữ liệu. Nó cũng có thể làm việc với nhiều cơ sở dữ liệu, bao gồm MySQL. Python hỗ trợ câu lệnh truy vấn dữ liệu, ngôn ngữ định nghĩa dữ liệu và thao tác dữ liệu. Hướng dẫn này sẽ chỉ bạn cách làm việc với MySQL trong Python.
Bắt đầu với MySQL trong Python
Để dùng MySQL trong Python từ không gian làm việc DataCamp của bạn, bạn phải dùng tích hợp workspace để kết nối với cơ sở dữ liệu được lưu trữ sẵn. Chúng ta sẽ xây dựng cơ sở dữ liệu từ đầu, nên sẽ không dùng DataCamp workspace cho hướng dẫn này.
Đây là hai bước bạn cần thực hiện để theo dõi hướng dẫn:
- Cài đặt máy chủ MySQL để cung cấp các dịch vụ cần thiết để quản lý cơ sở dữ liệu. Bạn có thể tải và cài đặt từ trang web MySQL.
- Cài đặt MySQL connector là một trình điều khiển Python giúp bạn tích hợp ứng dụng Python với cơ sở dữ liệu MySQL; có thể cài đặt đơn giản bằng pip (trình quản lý gói của Python).
Khi bạn đã cài đặt máy chủ MySQL:
- Clone kho GitHub này về máy cục bộ – cách clone một kho trên Github.
- Tạo và kích hoạt môi trường ảo – tạo môi trường ảo.
- Cài đặt các gói cần thiết bằng
pip install -r requirementstừ terminal. - Tạo tệp
.envtrong thư mục gốc. - Lưu mật khẩu để xác thực người dùng của bạn với máy chủ MySQL vào biến có tên
PASSWORD– Nếu bạn không đặt mật khẩu root, máy chủ sẽ không yêu cầu mật khẩu.
Tuyên bố miễn trừ
Mỗi tệp trong kho mã đều có tiền tố là một số để biểu thị thứ tự trong hướng dẫn này.
Ví dụ, 04_data_insertion.py cho biết mô-đun nên được chạy thứ 4 (sau các mô-đun 01 - 03). Bạn cũng có thể chạy toàn bộ mã bằng cách chạy 00_execute_all.py.
Thiết lập kết nối
MySQL tuân theo mô hình máy chủ - máy khách; bất cứ khi nào máy khách muốn truy cập dữ liệu, nó phải kết nối tới RDBMS.
Cách thiết lập kết nối với máy chủ là dùng phương thức connect() từ mô-đun mysql.connector…
import os
from mysql import connector
from dotenv import load_dotenv
load_dotenv()
PASSWORD = os.getenv("PASSWORD")
try:
with connector.connect(
host = "localhost",
user = "root",
password = PASSWORD
) as database:
print(database)
except connector.Error as e:
print(e)
"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x00000188FA653970>
"""
Xem đầy đủ các đối số cho phương thức connect() trong tài liệu.
Có ba điều cần lưu ý về đoạn mã này:
- Xử lý ngoại lệ và lỗi: Thực hành tốt là xử lý lỗi khi thiết lập kết nối tới máy chủ MySQL.
- Đóng kết nối: Chúng tôi dùng context manager, nên không cần đóng kết nối một cách tường minh bằng phương thức
close(). Nói chung, kết nối phải được đóng sau khi bạn hoàn tất truy cập cơ sở dữ liệu để tránh lỗi không mong muốn. - Dữ liệu nhạy cảm: Dùng biến môi trường để ẩn thông tin nhạy cảm, vì chia sẻ thông tin này gây rủi ro bảo mật.
Giờ đây bạn đã thiết lập kết nối giữa chương trình Python và máy chủ MySQL, bạn sẵn sàng kết nối tới một trong nhiều cơ sở dữ liệu có sẵn trên máy chủ. Hiện tại, chúng ta chưa có cái nào; nghĩa là chúng ta sẽ phải tạo cơ sở dữ liệu mới trong máy chủ. Hãy xem cách làm ở phần tiếp theo.
Lưu ý: Bất cứ khi nào truy cập cơ sở dữ liệu, phải thiết lập kết nối với máy chủ. Ở các ví dụ mã sau, chúng tôi sẽ bỏ phần này để tránh lặp lại trong suốt hướng dẫn. Tuy nhiên, nó được bao gồm trong mã nguồn.
Tạo cơ sở dữ liệu mới trong MySQL với Python
Từ đây trở đi, bạn sẽ cần kỹ năng SQL; khóa học Giới thiệu về SQL của DataCamp là điểm khởi đầu tốt để bạn bắt kịp.
Cách điển hình để tạo cơ sở dữ liệu trong MySQL như sau:
CREATE DATABASE book_ratings;
Để thực hiện cùng truy vấn đó trong Python, bạn phải tạo một thể hiện của đối tượng cursor().
Từ đối tượng cursor(), bạn có thể truyền các câu lệnh SQL dưới dạng chuỗi vào phương thức execute(), phương thức này sẽ thực thi mã.
Hãy tạo một cơ sở dữ liệu tên là "book_ratings…"
create_db = "CREATE DATABASE book_ratings"
with database.cursor() as cursor:
cursor.execute(create_db)
Lưu ý: Chạy đoạn mã này nhiều lần sẽ báo lỗi thông báo cơ sở dữ liệu đã tồn tại.
Bạn có thể kiểm tra các cơ sở dữ liệu đang tồn tại trên máy chủ như sau:
show_existing_db = "SHOW DATABASES"
with database.cursor() as cursor:
cursor.execute(show_existing_db)
for db in cursor:
print(db)
"""
('book_ratings',)
('information_schema',)
('mysql',)
('performance_schema',)
('sakila',)
('sys',)
('world',)
"""
Đoạn mã trên in ra tên của tất cả cơ sở dữ liệu hiện có trong máy chủ MySQL của chúng ta. Có nhiều hơn một vì máy chủ MySQL tự động tạo các cơ sở dữ liệu để cung cấp quyền truy cập vào nhiều siêu dữ liệu cơ sở dữ liệu và thiết lập máy chủ.
Kết nối tới cơ sở dữ liệu hiện có
Giả sử bạn đã tạo cơ sở dữ liệu, nhưng chưa kết nối tới máy chủ; làm sao để kết nối trực tiếp vào cơ sở dữ liệu?
Rất đơn giản.
Truyền tên cơ sở dữ liệu làm đối số cho phương thức connect():
try:
with connector.connect(
host = "localhost",
user = "root",
password = PASSWORD,
database = "book_ratings"
) as database:
print(database})
except connector.Error as e:
print(e)
"""
<mysql.connector.connection_cext.CMySQLConnection object at 0x0000016DD8C24970>
"""
Tạo bảng
Thông tin trong cơ sở dữ liệu được lưu trong bảng. Bảng chỉ là một định dạng dùng để lưu trữ một tập dữ liệu liên quan gồm các cột và hàng.
Có thể có nhiều bảng trong một cơ sở dữ liệu, ngay cả khi chúng không liên quan tới nhau. Bạn cũng có thể có một cơ sở dữ liệu quan hệ chỉ chứa một bảng, như chúng ta sẽ minh họa trong phần này – mở rộng kiến thức về cơ sở dữ liệu quan hệ với khóa Giới thiệu Cơ sở dữ liệu Quan hệ trong SQL.
Việc tạo bảng tương tự như những gì bạn đã thấy;
- Viết câu lệnh SQL dưới dạng chuỗi
- Truyền vào phương thức
execute()của đối tượng cursor.
Câu lệnh SQL trong trường hợp này là CREATE TABLE.
Hãy dùng điều này để tạo bảng cho sách:
create_books_table = """
CREATE TABLE books(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100),
author VARCHAR(100),
genre VARCHAR(100),
release_year YEAR(4)
)
"""
# Create cursor object
with existing_database.cursor() as cursor:
cursor.execute(create_books_table)
existing_database.commit()
Ở dòng cuối của đoạn mã, bạn có thể để ý chúng ta dùng phương thức commit() trên đối tượng existing_database. Chúng ta phải làm vậy vì hành vi mặc định của MySQL Python connector là không tự động commit giao dịch.
Bất cứ khi nào bạn sửa đổi dữ liệu của một bảng, bạn phải gọi phương thức commit() – tìm hiểu thêm về phương thức commit() trong tài liệu MySQL.
Một vài điểm quan trọng khác trong mã gồm có:
NOT NULL: Ràng buộc để buộc một cột không chấp nhận giá trịNULL.PRIMARY KEY: Giá trị duy nhất dùng để định danh các hàng cụ thể trong bảng.AUTO_INCREMENT: Tự động tạo số duy nhất cho các bản ghi mới chèn vào bảng.
Chúng ta có thể kiểm tra xem schema đã được tạo đúng chưa bằng cách dùng câu lệnh DESCRIBE rồi in tất cả phần tử bằng phương thức fetchall() trên đối tượng cursor…
describe_books = "DESCRIBE books"
with existing_database.cursor() as cursor:
cursor.execute(describe_books)
books_schema = cursor.fetchall()
for column in books_schema:
print(column)
"""
('id', b'int', 'NO', 'PRI', None, 'auto_increment')
('title', b'varchar(100)', 'YES', '', None, '')
('author', b'varchar(100)', 'YES', '', None, '')
('genre', b'varchar(100)', 'YES', '', None, '')
('release_year', b'year', 'YES', '', None, '')
"""
Chèn dữ liệu
Ở các phần trước, chúng ta đã tạo một bảng tên books trong cơ sở dữ liệu book_ratings. Hiện tại, bảng này đang trống. Phần tiếp theo sẽ trình bày hai cách bạn có thể dùng để điền dữ liệu vào bảng.
Chèn một bản ghi
Có thể có trường hợp bạn cần chèn một bản ghi duy nhất vào bảng. Dù điều này hiếm khi xảy ra ngoài thực tế, bạn vẫn có thể thực hiện như sau:
# INSERT SINGLE RECORD
insert_single_record = "INSERT INTO books (id, title, author, genre, release_year)\
VALUES (%s, %s, %s, %s, %s)"
single_record = (
"1", "Choose Yourself! Be Happy, Make Millions, Live the Dream", "James Altucher", "self-help", "2013"
)
# Create cursor object
with existing_database.cursor() as cursor:
cursor.execute(insert_single_record, single_record)
existing_database.commit()
Chèn nhiều bản ghi
Cách phổ biến hơn để chèn dữ liệu vào bảng là dùng phương thức executemany(operation_to_perform, seq_of_params) của đối tượng cursor; cách này cho phép bạn chèn nhiều bản ghi cùng lúc.
Cấu trúc của thao tác muốn thực hiện vẫn giữ nguyên; chúng ta chỉ cập nhật dãy tham số.
Mã sẽ trông như sau:
multiple_records = [
(
"2",
"Skip the Line: The 10,000 Experiments Rule and Other Surprising Advice for Reaching Your Goals",
"James Altucher",
"self-help",
"2021"
),
(
"3",
"The Power of No: Because One Little Word Can Bring Health, Abundance, and Happiness",
"James Altucher",
"self-help",
"2014"
),
]
with existing_database.cursor() as cursor:
cursor.executemany(insert_multiple_records, multiple_records)
existing_database.commit()
Truy vấn dữ liệu
Câu lệnh SELECT được dùng để truy xuất các hàng được chọn từ một hoặc nhiều bảng trong cơ sở dữ liệu. Chúng ta có thể dùng SELECT theo hai cách:
- Chọn các cột cụ thể từ một bảng.
select_specific_cols = "SELECT author, release_year FROM books"
with existing_database.cursor() as cursor:
cursor.execute(select_specific_cols)
- Trả về tất cả các cột bằng dấu hoa thị "*"
# Create cursor object
select_all_cols = "SELECT * FROM books"
with existing_database.cursor() as cursor:
cursor.execute(select_all_cols)
Sắp xếp và lọc dữ liệu
Sắp xếp và lọc dữ liệu giúp bạn trả về các kết quả quan tâm bằng cách đưa ra tiêu chí cụ thể mà bản ghi cần đáp ứng.
Dưới đây là một vài ví dụ:
WHERE
Câu lệnh WHERE cho phép bạn lọc dữ liệu dựa trên một điều kiện xác định.
Ví dụ, giả sử chúng ta muốn trích xuất tên tác giả và tiêu đề sách cho bất kỳ cuốn sách nào phát hành trước và bao gồm cả năm 2010:
condition = "SELECT author, title FROM books WHERE release_year <= 2010"
with existing_database.cursor() as cursor:
cursor.execute(condition)
ORDER BY
Chúng ta cũng có thể dùng câu lệnh ORDER BY để sắp xếp kết quả theo thứ tự tăng dần (ASC) hoặc giảm dần (DESC). Lưu ý chế độ mặc định luôn là tăng dần trừ khi bạn chỉ định khác.
Dưới đây là cách sắp xếp dữ liệu theo năm phát hành giảm dần:
order_by_year = "SELECT * FROM books ORDER BY release_year DESC"
with existing_database.cursor() as cursor:
cursor.execute(order_by_year)
LIMIT
Câu lệnh LIMIT cho phép bạn chỉ định số lượng bản ghi sẽ trả về trong tập kết quả.
# Create cursor object
define_limit = "SELECT * FROM books LIMIT 3"
with existing_database.cursor() as cursor:
cursor.execute(define_limit)
Đoạn mã trên giới hạn số bản ghi trả về là ba.
Cập nhật và Xóa dữ liệu
Sẽ có lúc dữ liệu thay đổi, không còn hữu ích, hoặc sai. Trong phần này, bạn sẽ học cách xử lý các trường hợp đó bằng cập nhật và xóa.
UPDATE
Truy vấn UPDATE cho phép bạn thay đổi các giá trị hiện có trong một bảng mà không ảnh hưởng đến cấu trúc của nó.
Ví dụ, bạn có thể cần cập nhật một bản ghi nếu ai đó đổi tên; Mã sẽ trông như sau:
update_query = """
UPDATE
books
SET
author = "Big J"
WHERE
author = "James Altucher"
"""
with existing_database.cursor() as cursor:
cursor.execute(update_query)
existing_database.commit()
DELETE
Truy vấn DELETE cho phép bạn xóa một bản ghi khỏi bảng:
drop_record = "DELETE FROM books WHERE release_year <= 2000"
with existing_database.cursor() as cursor:
cursor.execute(drop_record)
existing_database.commit()
Trong đoạn mã này, chúng ta đã xóa tất cả bản ghi có năm phát hành nhỏ hơn hoặc bằng 2000.
DROP TABLE
Câu lệnh DROP TABLE cho phép bạn xóa vĩnh viễn một bảng khỏi cơ sở dữ liệu. Thêm IF EXISTS giúp xử lý các trường hợp bạn không chắc bảng cần xóa có tồn tại hay không, nhưng hoàn toàn là tùy chọn.
Hãy xóa bảng chúng ta đã tạo trong cơ sở dữ liệu book_ratings:
drop_table = "DROP TABLE IF EXISTS books"
with existing_database.cursor() as cursor:
cursor.execute(drop_table)
existing_database.commit()
Kết luận
Trong hướng dẫn này, bạn đã học cách thiết lập kết nối với máy chủ MySQL trong Python, tạo cơ sở dữ liệu mới, kết nối tới cơ sở dữ liệu hiện có, tạo bảng và thực hiện nhiều thao tác truy vấn trên bảng MySQL từ Python.
Hãy xem các tài nguyên sau để tiếp tục học: