Python có thể quản lý cơ sở dữ liệu không?

MySQL là một trong những hệ thống quản lý cơ sở dữ liệu (DBMS) phổ biến nhất trên thị trường hiện nay. Nó chỉ xếp thứ hai sau Oracle DBMS trong Bảng xếp hạng DB-Engines năm nay. Vì hầu hết các ứng dụng phần mềm cần tương tác với dữ liệu ở một dạng nào đó, nên các ngôn ngữ lập trình như Python cung cấp các công cụ để lưu trữ và truy cập các nguồn dữ liệu này

Sử dụng các kỹ thuật được thảo luận trong hướng dẫn này, bạn sẽ có thể tích hợp hiệu quả cơ sở dữ liệu MySQL với ứng dụng Python. Bạn sẽ phát triển một cơ sở dữ liệu MySQL nhỏ cho hệ thống xếp hạng phim và tìm hiểu cách truy vấn nó trực tiếp từ mã Python của bạn

Đến cuối hướng dẫn này, bạn sẽ có thể

  • Xác định các tính năng độc đáo của MySQL
  • Kết nối ứng dụng của bạn với cơ sở dữ liệu MySQL
  • Truy vấn cơ sở dữ liệu để lấy dữ liệu cần thiết
  • Xử lý các ngoại lệ xảy ra khi truy cập cơ sở dữ liệu
  • Sử dụng các phương pháp hay nhất trong khi xây dựng các ứng dụng cơ sở dữ liệu

Để tận dụng tối đa hướng dẫn này, bạn nên có kiến ​​thức làm việc về các khái niệm Python như vòng lặp

cursor = connection.cursor()
0, hàm, xử lý ngoại lệ và cài đặt các gói Python bằng cách sử dụng
cursor = connection.cursor()
1. Bạn cũng nên có hiểu biết cơ bản về các hệ thống quản lý cơ sở dữ liệu quan hệ và các truy vấn SQL như
cursor = connection.cursor()
2,
cursor = connection.cursor()
3,
cursor = connection.cursor()
4 và
cursor = connection.cursor()
5

Tải xuống miễn phí. Nhận một chương mẫu từ Thủ thuật Python. Cuốn sách chỉ cho bạn các phương pháp hay nhất về Python với các ví dụ đơn giản mà bạn có thể áp dụng ngay lập tức để viết mã Pythonic + đẹp hơn

So sánh MySQL với các cơ sở dữ liệu SQL khác

SQL là viết tắt của Structured Query Language và là ngôn ngữ lập trình được sử dụng rộng rãi để quản lý cơ sở dữ liệu quan hệ. Bạn có thể đã nghe nói về các hương vị khác nhau của DBMS dựa trên SQL. Những cái phổ biến nhất bao gồm MySQL, PostgreSQL, SQLite và SQL Server. Tất cả các cơ sở dữ liệu này đều tuân thủ các tiêu chuẩn SQL nhưng với các mức độ tuân thủ khác nhau

Là nguồn mở kể từ khi thành lập vào năm 1995, MySQL nhanh chóng trở thành công ty dẫn đầu thị trường trong số các giải pháp SQL. MySQL cũng là một phần của hệ sinh thái Oracle. Mặc dù chức năng cốt lõi của nó hoàn toàn miễn phí, nhưng cũng có một số tiện ích bổ sung trả phí. Hiện tại, MySQL được sử dụng bởi tất cả các công ty công nghệ lớn, bao gồm Google, LinkedIn, Uber, Netflix, Twitter và các công ty khác

Ngoài một cộng đồng nguồn mở lớn để hỗ trợ, còn có nhiều lý do khác cho sự thành công của MySQL

  1. Dễ cài đặt. MySQL được thiết kế thân thiện với người dùng. Việc thiết lập cơ sở dữ liệu MySQL khá đơn giản và một số công cụ của bên thứ ba có sẵn rộng rãi, như phpMyAdmin, tiếp tục hợp lý hóa quy trình thiết lập. MySQL có sẵn cho tất cả các hệ điều hành chính, bao gồm Windows, macOS, Linux và Solaris

  2. Tốc độ. MySQL nổi tiếng là một giải pháp cơ sở dữ liệu cực kỳ nhanh. Nó có dấu chân tương đối nhỏ hơn và cực kỳ có thể mở rộng trong thời gian dài

  3. Đặc quyền người dùng và bảo mật. MySQL đi kèm với một tập lệnh cho phép bạn đặt mức bảo mật mật khẩu, chỉ định mật khẩu quản trị viên và thêm và xóa đặc quyền tài khoản người dùng. Tập lệnh này đơn giản hóa quy trình quản trị cho cổng quản lý người dùng lưu trữ web. Các DBMS khác, như PostgreSQL, sử dụng các tệp cấu hình phức tạp hơn để sử dụng

Mặc dù MySQL nổi tiếng về tốc độ và tính dễ sử dụng, nhưng bạn có thể nhận được nhiều tính năng nâng cao hơn với PostgreSQL. Ngoài ra, MySQL không hoàn toàn tuân thủ SQL và có một số hạn chế về chức năng, chẳng hạn như không hỗ trợ mệnh đề

cursor = connection.cursor()
6

Bạn cũng có thể gặp phải một số vấn đề với việc đọc và ghi đồng thời trong MySQL. Nếu phần mềm của bạn có nhiều người dùng ghi dữ liệu vào nó cùng một lúc thì PostgreSQL có thể là lựa chọn phù hợp hơn

Ghi chú. Để có sự so sánh sâu hơn về MySQL và PostgreSQL trong bối cảnh thế giới thực, hãy xem Tại sao Uber Engineering lại chuyển từ Postgres sang MySQL

SQL Server cũng là một DBMS rất phổ biến và được biết đến với độ tin cậy, hiệu quả và bảo mật. Nó được ưa thích bởi các công ty, đặc biệt là trong lĩnh vực ngân hàng, những người thường xuyên xử lý khối lượng công việc lưu lượng truy cập lớn. Đó là một giải pháp thương mại và là một trong những hệ thống tương thích nhất với các dịch vụ Windows

Năm 2010, khi Oracle mua lại Sun Microsystems và MySQL, nhiều người đã lo lắng về tương lai của MySQL. Vào thời điểm đó, Oracle là đối thủ cạnh tranh lớn nhất của MySQL. Các nhà phát triển lo ngại rằng đây là một sự tiếp quản thù địch từ Oracle với mục đích phá hủy MySQL

Một số nhà phát triển dẫn đầu bởi Michael Widenius, tác giả ban đầu của MySQL, đã tạo ra một nhánh của cơ sở mã MySQL và đặt nền tảng cho MariaDB. Mục đích là để đảm bảo quyền truy cập vào MySQL và giữ cho nó miễn phí mãi mãi

Đến nay, MariaDB vẫn được cấp phép GPL đầy đủ, giữ nó hoàn toàn thuộc phạm vi công cộng. Mặt khác, một số tính năng của MySQL chỉ khả dụng với giấy phép trả phí. Ngoài ra, MariaDB cung cấp một số tính năng cực kỳ hữu ích mà máy chủ MySQL không hỗ trợ, như SQL phân tán và lưu trữ dạng cột. Bạn có thể tìm thêm sự khác biệt giữa MySQL và MariaDB được liệt kê trên trang web của MariaDB

MySQL sử dụng cú pháp rất giống với SQL chuẩn. Tuy nhiên, có một số khác biệt đáng chú ý được đề cập trong tài liệu chính thức

Loại bỏ các quảng cáo

Cài đặt Máy chủ MySQL và Trình kết nối MySQL/Python

Bây giờ, để bắt đầu làm việc với hướng dẫn này, bạn cần thiết lập hai thứ. máy chủ MySQL và trình kết nối MySQL. Máy chủ MySQL sẽ cung cấp tất cả các dịch vụ cần thiết để xử lý cơ sở dữ liệu của bạn. Sau khi máy chủ hoạt động, bạn có thể kết nối ứng dụng Python của mình với nó bằng Trình kết nối MySQL/Python

Cài đặt máy chủ MySQL

Tài liệu chính thức nêu chi tiết cách được đề xuất để tải xuống và cài đặt máy chủ MySQL. Bạn sẽ tìm thấy hướng dẫn cho tất cả các hệ điều hành phổ biến, bao gồm Windows, macOS, Solaris, Linux, v.v.

Đối với Windows, cách tốt nhất là tải xuống MySQL Installer và để nó đảm nhận toàn bộ quá trình. Trình quản lý cài đặt cũng giúp bạn định cấu hình cài đặt bảo mật của máy chủ MySQL. Trên trang Tài khoản và Vai trò, bạn cần nhập mật khẩu cho tài khoản gốc (quản trị viên) và cũng có thể tùy ý thêm những người dùng khác với các đặc quyền khác nhau

Python có thể quản lý cơ sở dữ liệu không?
Thiết lập tài khoản trình cài đặt MySQL

Mặc dù bạn phải chỉ định thông tin đăng nhập cho tài khoản gốc trong khi thiết lập, nhưng bạn có thể sửa đổi các cài đặt này sau này

Ghi chú. Hãy nhớ tên máy chủ, tên người dùng và mật khẩu vì chúng sẽ được yêu cầu để thiết lập kết nối với máy chủ MySQL sau này

Mặc dù bạn chỉ cần máy chủ MySQL cho hướng dẫn này, nhưng bạn cũng có thể thiết lập các công cụ hữu ích khác như MySQL Workbench bằng các trình cài đặt này. Nếu bạn không muốn cài đặt MySQL trực tiếp trong hệ điều hành của mình, thì triển khai MySQL trên Linux với Docker là một giải pháp thay thế thuận tiện

Cài đặt Trình kết nối MySQL/Python

Trình điều khiển cơ sở dữ liệu là một phần mềm cho phép ứng dụng kết nối và tương tác với hệ thống cơ sở dữ liệu. Các ngôn ngữ lập trình như Python cần một trình điều khiển đặc biệt trước khi chúng có thể nói chuyện với cơ sở dữ liệu từ một nhà cung cấp cụ thể

Các trình điều khiển này thường được lấy dưới dạng mô-đun của bên thứ ba. API cơ sở dữ liệu Python (DB-API) xác định giao diện tiêu chuẩn mà tất cả trình điều khiển cơ sở dữ liệu Python phải tuân thủ. Những chi tiết này được ghi lại trong PEP 249. Tất cả trình điều khiển cơ sở dữ liệu Python, chẳng hạn như sqlite3 cho SQLite, psycopg cho PostgreSQL và MySQL Connector/Python cho MySQL, hãy tuân theo các quy tắc triển khai này

Ghi chú. Tài liệu chính thức của MySQL sử dụng thuật ngữ trình kết nối thay vì trình điều khiển. Về mặt kỹ thuật, các trình kết nối chỉ được liên kết với việc kết nối với cơ sở dữ liệu, không tương tác với nó. Tuy nhiên, thuật ngữ này thường được sử dụng cho toàn bộ mô-đun truy cập cơ sở dữ liệu bao gồm trình kết nối và trình điều khiển.

Để duy trì tính nhất quán với tài liệu, bạn sẽ thấy thuật ngữ trình kết nối bất cứ khi nào MySQL được đề cập

Nhiều ngôn ngữ lập trình phổ biến có API cơ sở dữ liệu riêng. Ví dụ: Java có API Kết nối cơ sở dữ liệu Java (JDBC). Nếu bạn cần kết nối một ứng dụng Java với cơ sở dữ liệu MySQL, thì bạn cần sử dụng trình kết nối JDBC của MySQL, tuân theo API JDBC

Tương tự, trong Python, bạn cần cài đặt trình kết nối Python MySQL để tương tác với cơ sở dữ liệu MySQL. Nhiều gói tuân theo các tiêu chuẩn DB-API, nhưng phổ biến nhất trong số đó là MySQL Connector/Python. Bạn có thể lấy nó với

cursor = connection.cursor()
1

________số 8

cursor = connection.cursor()
1 cài đặt trình kết nối dưới dạng mô-đun bên thứ ba trong môi trường ảo hiện đang hoạt động. Bạn nên thiết lập một môi trường ảo biệt lập cho dự án cùng với tất cả các thành phần phụ thuộc

Để kiểm tra xem quá trình cài đặt có thành công hay không, hãy nhập lệnh sau trên thiết bị đầu cuối Python của bạn

>>>

cursor = connection.cursor()
0

Nếu đoạn mã trên thực thi không có lỗi, thì

cursor = connection.cursor()
9 đã được cài đặt và sẵn sàng sử dụng. Nếu bạn gặp phải bất kỳ lỗi nào, hãy đảm bảo rằng bạn đang ở trong đúng môi trường ảo và bạn đang sử dụng đúng trình thông dịch Python

Đảm bảo rằng bạn đang cài đặt đúng gói

cursor = connection.cursor()
20, đây là gói triển khai Python thuần túy. Cẩn thận với các trình kết nối có tên tương tự nhưng hiện đã hết giá trị như
cursor = connection.cursor()
21

Loại bỏ các quảng cáo

Thiết lập kết nối với máy chủ MySQL

MySQL là một hệ thống quản lý cơ sở dữ liệu dựa trên máy chủ. Một máy chủ có thể chứa nhiều cơ sở dữ liệu. Để tương tác với cơ sở dữ liệu, trước tiên bạn phải thiết lập kết nối với máy chủ. Quy trình làm việc chung của chương trình Python tương tác với cơ sở dữ liệu dựa trên MySQL như sau

  1. Kết nối với máy chủ MySQL
  2. Tạo cơ sở dữ liệu mới
  3. Kết nối với cơ sở dữ liệu mới được tạo hoặc hiện có
  4. Thực thi truy vấn SQL và tìm nạp kết quả
  5. Thông báo cho cơ sở dữ liệu nếu có bất kỳ thay đổi nào đối với bảng
  6. Đóng kết nối với máy chủ MySQL

Đây là quy trình công việc chung có thể khác nhau tùy thuộc vào từng ứng dụng. Nhưng bất kể ứng dụng có thể là gì, bước đầu tiên là kết nối cơ sở dữ liệu của bạn với ứng dụng của bạn

Thiết lập kết nối

Bước đầu tiên trong việc tương tác với máy chủ MySQL là thiết lập kết nối. Để làm điều này, bạn cần có

cursor = connection.cursor()
22 từ mô-đun
cursor = connection.cursor()
9. Hàm này nhận các tham số như
cursor = connection.cursor()
24,
cursor = connection.cursor()
25 và
cursor = connection.cursor()
26 và trả về một đối tượng
cursor = connection.cursor()
27. Bạn có thể nhận các thông tin đăng nhập này dưới dạng đầu vào từ người dùng và chuyển chúng tới
cursor = connection.cursor()
22

cursor = connection.cursor()
1

Đoạn mã trên sử dụng thông tin đăng nhập đã nhập để thiết lập kết nối với máy chủ MySQL của bạn. Đổi lại, bạn nhận được một đối tượng

cursor = connection.cursor()
27, được lưu trữ trong biến
cursor = connection.cursor()
30. Từ giờ trở đi, bạn sẽ sử dụng biến này để truy cập máy chủ MySQL của mình

Có một số điều quan trọng cần chú ý trong đoạn mã trên

  • Bạn phải luôn xử lý các ngoại lệ có thể phát sinh trong khi thiết lập kết nối với máy chủ MySQL. Đây là lý do tại sao bạn sử dụng khối

    cursor = connection.cursor()
    
    31 …
    cursor = connection.cursor()
    
    32 để bắt và in bất kỳ trường hợp ngoại lệ nào mà bạn có thể gặp phải

  • Bạn phải luôn đóng kết nối sau khi truy cập xong cơ sở dữ liệu. Để các kết nối mở không sử dụng có thể dẫn đến một số lỗi không mong muốn và các vấn đề về hiệu suất. Đoạn mã trên tận dụng trình quản lý ngữ cảnh bằng cách sử dụng

    cursor = connection.cursor()
    
    33, giúp loại bỏ quá trình dọn dẹp kết nối

  • Bạn không bao giờ nên mã hóa cứng thông tin đăng nhập của mình, nghĩa là tên người dùng và mật khẩu của bạn, trực tiếp trong tập lệnh Python. Đây là một phương pháp không tốt để triển khai và gây ra mối đe dọa bảo mật nghiêm trọng. Đoạn mã trên nhắc người dùng về thông tin đăng nhập. Nó sử dụng mô-đun

    cursor = connection.cursor()
    
    34 tích hợp để ẩn mật khẩu. Mặc dù điều này tốt hơn so với mã hóa cứng, nhưng có nhiều cách khác an toàn hơn để lưu trữ thông tin nhạy cảm, chẳng hạn như sử dụng các biến môi trường

Bây giờ bạn đã thiết lập kết nối giữa chương trình và máy chủ MySQL của mình, nhưng bạn vẫn cần tạo cơ sở dữ liệu mới hoặc kết nối với cơ sở dữ liệu hiện có bên trong máy chủ

Tạo cơ sở dữ liệu mới

Trong phần trước, bạn đã thiết lập kết nối với máy chủ MySQL của mình. Để tạo một cơ sở dữ liệu mới, bạn cần thực thi một câu lệnh SQL

cursor = connection.cursor()
8

Câu lệnh trên sẽ tạo một cơ sở dữ liệu mới với tên

cursor = connection.cursor()
35

Ghi chú. Trong MySQL, bắt buộc phải đặt dấu chấm phẩy (_______236) ở cuối câu lệnh, dấu chấm phẩy biểu thị sự kết thúc của truy vấn. Tuy nhiên, Trình kết nối MySQL/Python tự động thêm dấu chấm phẩy vào cuối truy vấn của bạn, vì vậy bạn không cần sử dụng nó trong mã Python của mình

Để thực hiện một truy vấn SQL trong Python, bạn sẽ cần sử dụng một con trỏ, con trỏ này sẽ loại bỏ quyền truy cập vào các bản ghi cơ sở dữ liệu. MySQL Connector/Python cung cấp cho bạn lớp

cursor = connection.cursor()
37, giúp khởi tạo các đối tượng có thể thực thi các truy vấn MySQL trong Python. Một thể hiện của lớp
cursor = connection.cursor()
37 cũng được gọi là một
cursor = connection.cursor()
39

Đối tượng

cursor = connection.cursor()
39 sử dụng đối tượng
cursor = connection.cursor()
27 để tương tác với máy chủ MySQL của bạn. Để tạo một
cursor = connection.cursor()
39, hãy sử dụng phương pháp
cursor = connection.cursor()
73 của biến
cursor = connection.cursor()
30 của bạn

cursor = connection.cursor()

Đoạn mã trên cung cấp cho bạn một thể hiện của lớp

cursor = connection.cursor()
37

Một truy vấn cần được thực hiện được gửi tới

cursor = connection.cursor()
76 ở định dạng chuỗi. Trong trường hợp cụ thể này, bạn sẽ gửi truy vấn
cursor = connection.cursor()
77 tới
cursor = connection.cursor()
76

cursor = connection.cursor()
2

Sau khi thực thi đoạn mã trên, bạn sẽ có một cơ sở dữ liệu mới có tên là

cursor = connection.cursor()
79 trong máy chủ MySQL của mình

Truy vấn

cursor = connection.cursor()
77 được lưu trữ dưới dạng một chuỗi trong biến
cursor = connection.cursor()
71 và sau đó được chuyển đến
cursor = connection.cursor()
76 để thực hiện. Mã sử ​​dụng trình quản lý ngữ cảnh với đối tượng
cursor = connection.cursor()
39 để xử lý quy trình dọn dẹp

Bạn có thể gặp lỗi ở đây nếu cơ sở dữ liệu có cùng tên đã tồn tại trong máy chủ của bạn. Để xác nhận điều này, bạn có thể hiển thị tên của tất cả các cơ sở dữ liệu trong máy chủ của mình. Sử dụng cùng một đối tượng

cursor = connection.cursor()
27 từ trước đó, thực hiện câu lệnh
cursor = connection.cursor()
75

>>>

cursor = connection.cursor()
3

Đoạn mã trên in tên của tất cả các cơ sở dữ liệu hiện có trong máy chủ MySQL của bạn. Lệnh

cursor = connection.cursor()
75 cũng xuất ra một số cơ sở dữ liệu mà bạn không tạo trong máy chủ của mình, như
cursor = connection.cursor()
77,
cursor = connection.cursor()
78, v.v. Các cơ sở dữ liệu này được tạo tự động bởi máy chủ MySQL và cung cấp quyền truy cập vào nhiều siêu dữ liệu cơ sở dữ liệu và cài đặt máy chủ MySQL

Bạn đã tạo một cơ sở dữ liệu mới trong phần này bằng cách thực hiện câu lệnh

cursor = connection.cursor()
77. Trong phần tiếp theo, bạn sẽ thấy cách kết nối với cơ sở dữ liệu đã tồn tại

Loại bỏ các quảng cáo

Kết nối với cơ sở dữ liệu hiện có

Trong phần trước, bạn đã tạo một cơ sở dữ liệu mới có tên là

cursor = connection.cursor()
79. Tuy nhiên, bạn vẫn chưa kết nối với nó. Trong nhiều trường hợp, bạn đã có cơ sở dữ liệu MySQL mà bạn muốn kết nối với ứng dụng Python của mình

Bạn có thể thực hiện việc này bằng cách sử dụng cùng chức năng

cursor = connection.cursor()
22 mà bạn đã sử dụng trước đó bằng cách gửi tham số bổ sung có tên là
cursor = connection.cursor()
92

cursor = connection.cursor()
7

Đoạn mã trên rất giống với tập lệnh kết nối mà bạn đã sử dụng trước đó. Thay đổi duy nhất ở đây là một tham số

cursor = connection.cursor()
92 bổ sung, trong đó tên cơ sở dữ liệu của bạn được chuyển đến
cursor = connection.cursor()
22. Khi bạn thực thi tập lệnh này, bạn sẽ được kết nối với cơ sở dữ liệu
cursor = connection.cursor()
79

Tạo, thay đổi và xóa bảng

Trong phần này, bạn sẽ học cách thực hiện một số truy vấn DDL cơ bản như

cursor = connection.cursor()
4,
cursor = connection.cursor()
3 và
cursor = connection.cursor()
98 bằng Python. Bạn sẽ xem nhanh cơ sở dữ liệu MySQL mà bạn sẽ sử dụng trong phần còn lại của hướng dẫn này. Bạn cũng sẽ tạo tất cả các bảng cần thiết cho cơ sở dữ liệu và tìm hiểu cách thực hiện các sửa đổi trên các bảng này sau này.

Xác định lược đồ cơ sở dữ liệu

Bạn có thể bắt đầu bằng cách tạo lược đồ cơ sở dữ liệu cho hệ thống xếp hạng phim trực tuyến. Cơ sở dữ liệu sẽ bao gồm ba bảng

  1. cursor = connection.cursor()
    
    99 chứa thông tin chung về phim và có các thuộc tính sau
    • cursor = connection.cursor()
      
      000
    • cursor = connection.cursor()
      
      001
    • cursor = connection.cursor()
      
      002
    • cursor = connection.cursor()
      
      003
    • cursor = connection.cursor()
      
      004
  2. cursor = connection.cursor()
    
    005 chứa thông tin về những người đã đăng đánh giá hoặc xếp hạng và có các thuộc tính sau
    • cursor = connection.cursor()
      
      000
    • cursor = connection.cursor()
      
      007
    • cursor = connection.cursor()
      
      008
  3. cursor = connection.cursor()
    
    009 chứa thông tin về xếp hạng đã được đăng và có các thuộc tính sau
    • cursor = connection.cursor()
      
      010 (khóa ngoại)
    • cursor = connection.cursor()
      
      011 (khóa ngoại)
    • cursor = connection.cursor()
      
      012

Một hệ thống xếp hạng phim trong thế giới thực, như IMDb, sẽ cần lưu trữ một loạt các thuộc tính khác, như email, danh sách diễn viên phim, v.v. Nếu muốn, bạn có thể thêm nhiều bảng và thuộc tính vào cơ sở dữ liệu này. Nhưng ba bảng này sẽ đủ cho mục đích của hướng dẫn này

Hình ảnh dưới đây mô tả lược đồ cơ sở dữ liệu

Python có thể quản lý cơ sở dữ liệu không?
Sơ đồ lược đồ cho hệ thống xếp hạng phim trực tuyến

Các bảng trong cơ sở dữ liệu này có liên quan với nhau.

cursor = connection.cursor()
99 và
cursor = connection.cursor()
005 sẽ có mối quan hệ nhiều-nhiều vì một bộ phim có thể được nhiều người đánh giá xem xét và một người đánh giá có thể đánh giá nhiều phim. Bảng
cursor = connection.cursor()
009 kết nối bảng
cursor = connection.cursor()
99 với bảng
cursor = connection.cursor()
005

Tạo bảng bằng câu lệnh cursor = connection.cursor() 018

Bây giờ, để tạo một bảng mới trong MySQL, bạn cần sử dụng câu lệnh

cursor = connection.cursor()
018. Truy vấn MySQL sau đây sẽ tạo bảng
cursor = connection.cursor()
99 cho cơ sở dữ liệu
cursor = connection.cursor()
79 của bạn

cursor = connection.cursor()
7

Nếu bạn đã xem các câu lệnh SQL trước đây, thì hầu hết các truy vấn trên có thể có ý nghĩa. Nhưng có một số khác biệt trong cú pháp MySQL mà bạn nên biết

Ví dụ: MySQL có nhiều loại dữ liệu khác nhau để bạn xem xét, bao gồm

cursor = connection.cursor()
022,
cursor = connection.cursor()
023,
cursor = connection.cursor()
024, v.v. Ngoài ra, MySQL sử dụng từ khóa
cursor = connection.cursor()
025 khi giá trị cột phải được tăng tự động khi chèn bản ghi mới

Để tạo một bảng mới, bạn cần chuyển truy vấn này tới

cursor = connection.cursor()
76, chấp nhận truy vấn MySQL và thực hiện truy vấn trên cơ sở dữ liệu MySQL được kết nối

cursor = connection.cursor()
9

Bây giờ bạn có bảng

cursor = connection.cursor()
99 trong cơ sở dữ liệu của mình. Bạn chuyển
cursor = connection.cursor()
028 đến
cursor = connection.cursor()
76, thực hiện yêu cầu thực thi

Ghi chú. Biến

cursor = connection.cursor()
30 đề cập đến đối tượng
cursor = connection.cursor()
27 được trả về khi bạn kết nối với cơ sở dữ liệu của mình

Ngoài ra, hãy chú ý câu lệnh

cursor = connection.cursor()
032 ở cuối mã. Theo mặc định, trình kết nối MySQL của bạn không tự động thực hiện các giao dịch. Trong MySQL, các sửa đổi được đề cập trong giao dịch chỉ xảy ra khi cuối cùng bạn sử dụng lệnh
cursor = connection.cursor()
033. Luôn gọi phương thức này sau mỗi giao dịch để thực hiện các thay đổi trong bảng thực tế

Như bạn đã làm với bảng

cursor = connection.cursor()
99, hãy thực thi đoạn script sau để tạo bảng
cursor = connection.cursor()
005

cursor = connection.cursor()
00

Nếu được yêu cầu, bạn có thể thêm thông tin khác về người đánh giá, chẳng hạn như ID email hoặc thông tin nhân khẩu học của họ. Nhưng

cursor = connection.cursor()
007 và
cursor = connection.cursor()
008 sẽ phục vụ mục đích của bạn lúc này

Cuối cùng, bạn có thể tạo bảng

cursor = connection.cursor()
009 bằng tập lệnh sau

cursor = connection.cursor()
01

Việc triển khai các mối quan hệ khóa ngoại trong MySQL hơi khác và bị hạn chế so với SQL tiêu chuẩn. Trong MySQL, cả cha và con trong ràng buộc khóa ngoài phải sử dụng cùng một công cụ lưu trữ

Công cụ lưu trữ là thành phần phần mềm cơ bản mà hệ thống quản lý cơ sở dữ liệu sử dụng để thực hiện các thao tác SQL. Trong MySQL, các công cụ lưu trữ có hai loại khác nhau

  1. Công cụ lưu trữ giao dịch là giao dịch an toàn và cho phép bạn khôi phục giao dịch bằng các lệnh đơn giản như

    cursor = connection.cursor()
    
    039. Nhiều công cụ MySQL phổ biến, bao gồm InnoDB và NDB, thuộc danh mục này

  2. Các công cụ lưu trữ phi giao dịch phụ thuộc vào mã thủ công phức tạp để hoàn tác các câu lệnh đã cam kết trên cơ sở dữ liệu. MyISAM, MEMORY và nhiều công cụ MySQL khác không có giao dịch

InnoDB là công cụ lưu trữ mặc định và phổ biến nhất. Nó giúp duy trì tính toàn vẹn của dữ liệu bằng cách hỗ trợ các ràng buộc khóa ngoài. Điều này có nghĩa là mọi thao tác CRUD trên khóa ngoại đều được kiểm tra để đảm bảo rằng nó không dẫn đến sự không nhất quán giữa các bảng khác nhau

Ngoài ra, lưu ý rằng bảng

cursor = connection.cursor()
009 sử dụng các cột
cursor = connection.cursor()
010 và
cursor = connection.cursor()
011, cả hai khóa ngoại, cùng làm khóa chính. Bước này đảm bảo rằng người đánh giá không thể xếp hạng hai lần cho cùng một bộ phim

Bạn có thể chọn sử dụng lại cùng một con trỏ cho nhiều lần thực hiện. Trong trường hợp đó, tất cả các lần thực thi sẽ trở thành một giao dịch nguyên tử thay vì nhiều giao dịch riêng biệt. Ví dụ: bạn có thể thực hiện tất cả các câu lệnh

cursor = connection.cursor()
018 bằng một con trỏ và sau đó thực hiện giao dịch của mình chỉ một lần

cursor = connection.cursor()
02

Đoạn mã trên trước tiên sẽ thực thi cả ba câu lệnh

cursor = connection.cursor()
4. Sau đó, nó sẽ gửi một lệnh
cursor = connection.cursor()
033 đến máy chủ MySQL thực hiện giao dịch của bạn. Bạn cũng có thể sử dụng
cursor = connection.cursor()
046 để gửi lệnh
cursor = connection.cursor()
047 đến máy chủ MySQL và xóa tất cả các thay đổi dữ liệu khỏi giao dịch

Loại bỏ các quảng cáo

Hiển thị lược đồ bảng bằng cách sử dụng câu lệnh cursor = connection.cursor() 048

Bây giờ, bạn đã tạo cả ba bảng, bạn có thể xem lược đồ của chúng bằng cách sử dụng câu lệnh SQL sau

cursor = connection.cursor()
03

Để lấy lại một số kết quả từ đối tượng

cursor = connection.cursor()
39, bạn cần sử dụng
cursor = connection.cursor()
050. Phương thức này tìm nạp tất cả các hàng từ câu lệnh được thực thi cuối cùng. Giả sử bạn đã có đối tượng
cursor = connection.cursor()
27 trong biến
cursor = connection.cursor()
30, bạn có thể in ra tất cả các kết quả được tìm nạp bởi
cursor = connection.cursor()
050

>>>

cursor = connection.cursor()
04

Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được một bảng chứa thông tin về tất cả các cột trong bảng

cursor = connection.cursor()
99. Đối với mỗi cột, bạn sẽ nhận được thông tin chi tiết như loại dữ liệu của cột, liệu cột đó có phải là khóa chính hay không, v.v.

Sửa đổi lược đồ bảng bằng cách sử dụng câu lệnh cursor = connection.cursor() 98

Trong bảng

cursor = connection.cursor()
99, bạn có một cột tên là
cursor = connection.cursor()
004, chứa doanh thu phòng vé của một bộ phim tính bằng triệu đô la. Bạn có thể viết câu lệnh MySQL sau để sửa đổi kiểu dữ liệu của thuộc tính
cursor = connection.cursor()
004 từ
cursor = connection.cursor()
023 thành
cursor = connection.cursor()
060

cursor = connection.cursor()
05

cursor = connection.cursor()
061 có nghĩa là một số thập phân có thể có tối đa
cursor = connection.cursor()
062 chữ số, trong đó
cursor = connection.cursor()
063 là số thập phân, chẳng hạn như ________ 1064, ________ 1065, ______ 1066, v.v. Sau khi thực hiện câu lệnh
cursor = connection.cursor()
067, bạn có thể hiển thị lược đồ bảng được cập nhật bằng cách sử dụng
cursor = connection.cursor()
048

>>>

cursor = connection.cursor()
06

Như được hiển thị trong đầu ra, thuộc tính

cursor = connection.cursor()
004 hiện thuộc loại
cursor = connection.cursor()
061. Cũng lưu ý rằng trong đoạn mã trên, bạn gọi
cursor = connection.cursor()
76 hai lần. Nhưng
cursor = connection.cursor()
050 chỉ tìm nạp các hàng từ truy vấn được thực hiện cuối cùng, đó là truy vấn
cursor = connection.cursor()
073

Xóa bảng bằng câu lệnh cursor = connection.cursor() 3

Để xóa một bảng, bạn cần thực thi câu lệnh

cursor = connection.cursor()
075 trong MySQL. Xóa một bảng là một quá trình không thể đảo ngược. Nếu bạn thực thi mã bên dưới, thì bạn sẽ cần gọi lại truy vấn
cursor = connection.cursor()
018 để sử dụng bảng
cursor = connection.cursor()
009 trong các phần sắp tới

Để xóa bảng

cursor = connection.cursor()
009, hãy gửi
cursor = connection.cursor()
079 đến
cursor = connection.cursor()
76

cursor = connection.cursor()
07

Nếu bạn thực thi đoạn mã trên, bạn sẽ xóa thành công bảng

cursor = connection.cursor()
009

Chèn bản ghi vào bảng

Trong phần trước, bạn đã tạo ba bảng trong cơ sở dữ liệu của mình.

cursor = connection.cursor()
99,
cursor = connection.cursor()
005 và
cursor = connection.cursor()
009. Bây giờ bạn cần điền dữ liệu vào các bảng này. Phần này sẽ đề cập đến hai cách khác nhau để chèn bản ghi trong Trình kết nối MySQL cho Python

Phương pháp đầu tiên,

cursor = connection.cursor()
085, hoạt động tốt khi số lượng bản ghi ít và bản ghi có thể được mã hóa cứng. Phương pháp thứ hai,
cursor = connection.cursor()
086, phổ biến hơn và phù hợp hơn với các tình huống trong thế giới thực

Loại bỏ các quảng cáo

Sử dụng cursor = connection.cursor() 085

Cách tiếp cận đầu tiên sử dụng cùng một phương pháp

cursor = connection.cursor()
76 mà bạn đã sử dụng cho đến bây giờ. Bạn viết truy vấn
cursor = connection.cursor()
089 trong một chuỗi và chuyển nó tới
cursor = connection.cursor()
76. Bạn có thể sử dụng phương pháp này để chèn dữ liệu vào bảng
cursor = connection.cursor()
99

Để tham khảo, bảng

cursor = connection.cursor()
99 có năm thuộc tính

  1. cursor = connection.cursor()
    
    000
  2. cursor = connection.cursor()
    
    001
  3. cursor = connection.cursor()
    
    002
  4. cursor = connection.cursor()
    
    003
  5. cursor = connection.cursor()
    
    004

Bạn không cần thêm dữ liệu cho

cursor = connection.cursor()
000 vì
cursor = connection.cursor()
025 sẽ tự động tính toán
cursor = connection.cursor()
000 cho bạn. Đoạn script sau chèn các bản ghi vào bảng
cursor = connection.cursor()
99

cursor = connection.cursor()
08

Bảng

cursor = connection.cursor()
99 hiện được tải với ba mươi bản ghi. Mã gọi
cursor = connection.cursor()
032 ở cuối. Điều quan trọng là phải gọi
cursor = connection.cursor()
104 sau khi thực hiện bất kỳ sửa đổi nào đối với bảng

Sử dụng cursor = connection.cursor() 086

Cách tiếp cận trước phù hợp hơn khi số lượng bản ghi khá nhỏ và bạn có thể viết những bản ghi này trực tiếp vào mã. Nhưng điều này hiếm khi đúng. Bạn sẽ thường lưu trữ dữ liệu này trong một số tệp khác hoặc dữ liệu sẽ được tạo bởi một tập lệnh khác và sẽ cần được thêm vào cơ sở dữ liệu MySQL

Đây là nơi mà

cursor = connection.cursor()
086 có ích. Nó chấp nhận hai tham số

  1. Một truy vấn có chứa chỗ dành sẵn cho các bản ghi cần được chèn
  2. Một danh sách chứa tất cả các bản ghi mà bạn muốn chèn

Ví dụ sau chèn các bản ghi cho bảng

cursor = connection.cursor()
005

cursor = connection.cursor()
09

Trong đoạn mã trên, bạn chuyển cả truy vấn và danh sách bản ghi làm đối số cho

cursor = connection.cursor()
086. Những bản ghi này có thể đã được lấy từ một tệp hoặc từ người dùng và được lưu trữ trong danh sách
cursor = connection.cursor()
109

Mã này sử dụng

cursor = connection.cursor()
110 làm trình giữ chỗ cho hai chuỗi phải được chèn vào
cursor = connection.cursor()
111. Trình giữ chỗ đóng vai trò là trình xác định định dạng và giúp dành chỗ cho một biến bên trong chuỗi. Biến đã chỉ định sau đó được thêm vào vị trí này trong khi thực thi

Tương tự, bạn có thể sử dụng

cursor = connection.cursor()
086 để chèn bản ghi vào bảng
cursor = connection.cursor()
009

cursor = connection.cursor()
10

Tất cả ba bảng hiện đã được điền dữ liệu. Bây giờ bạn có một cơ sở dữ liệu đánh giá phim trực tuyến đầy đủ chức năng. Bước tiếp theo là hiểu cách tương tác với cơ sở dữ liệu này

Đọc bản ghi từ cơ sở dữ liệu

Cho đến bây giờ, bạn đã xây dựng cơ sở dữ liệu của mình. Bây giờ là lúc thực hiện một số truy vấn trên đó và tìm một số thuộc tính thú vị từ tập dữ liệu này. Trong phần này, bạn sẽ học cách đọc các bản ghi từ các bảng cơ sở dữ liệu bằng cách sử dụng câu lệnh

cursor = connection.cursor()
2

Loại bỏ các quảng cáo

Đọc bản ghi bằng cách sử dụng câu lệnh cursor = connection.cursor() 2

Để truy xuất bản ghi, bạn cần gửi truy vấn

cursor = connection.cursor()
2 tới
cursor = connection.cursor()
76. Sau đó, bạn sử dụng
cursor = connection.cursor()
050 để trích xuất bảng đã truy xuất dưới dạng danh sách các hàng hoặc bản ghi

Hãy thử viết một truy vấn MySQL để chọn tất cả các bản ghi từ bảng

cursor = connection.cursor()
99 và gửi tới
cursor = connection.cursor()
085

>>>

cursor = connection.cursor()
11

Biến

cursor = connection.cursor()
121 giữ các bản ghi được trả về từ việc sử dụng
cursor = connection.cursor()
122. Đó là danh sách các bộ đại diện cho các bản ghi riêng lẻ từ bảng

Trong truy vấn trên, bạn sử dụng mệnh đề

cursor = connection.cursor()
123 để hạn chế số hàng nhận được từ câu lệnh
cursor = connection.cursor()
2. Các nhà phát triển thường sử dụng
cursor = connection.cursor()
123 để thực hiện phân trang khi xử lý khối lượng dữ liệu lớn

Trong MySQL, mệnh đề

cursor = connection.cursor()
123 nhận một hoặc hai đối số số không âm. Khi sử dụng một đối số, bạn chỉ định số hàng tối đa sẽ trả về. Vì truy vấn của bạn bao gồm
cursor = connection.cursor()
127 nên chỉ các bản ghi
cursor = connection.cursor()
128 đầu tiên được tìm nạp. Khi sử dụng cả hai đối số, bạn cũng có thể chỉ định phần bù của hàng đầu tiên để trả về

cursor = connection.cursor()
12

Đối số đầu tiên chỉ định độ lệch của

cursor = connection.cursor()
129 và đối số thứ hai hạn chế số lượng hàng được trả về thành
cursor = connection.cursor()
128. Truy vấn trên sẽ trả về các hàng từ 3 đến 7

Bạn cũng có thể truy vấn các cột đã chọn

>>>

cursor = connection.cursor()
13

Bây giờ, mã chỉ xuất giá trị từ hai cột được chỉ định.

cursor = connection.cursor()
001 và
cursor = connection.cursor()
002

Lọc kết quả bằng mệnh đề cursor = connection.cursor() 133

Bạn có thể lọc các bản ghi bảng theo các tiêu chí cụ thể bằng cách sử dụng mệnh đề

cursor = connection.cursor()
133. Ví dụ: để truy xuất tất cả các phim có doanh thu phòng vé lớn hơn 300 triệu đô la, bạn có thể chạy truy vấn sau

cursor = connection.cursor()
14

Bạn cũng có thể sử dụng mệnh đề

cursor = connection.cursor()
135 trong truy vấn cuối cùng để sắp xếp kết quả từ người có thu nhập cao nhất đến người có thu nhập thấp nhất

>>>

cursor = connection.cursor()
15

MySQL cung cấp rất nhiều thao tác định dạng chuỗi như

cursor = connection.cursor()
136 để nối chuỗi. Thông thường, các trang web sẽ hiển thị tiêu đề phim cùng với năm phát hành để tránh nhầm lẫn. Để truy xuất tiêu đề của năm bộ phim có doanh thu cao nhất, nối với năm phát hành của chúng, bạn có thể viết truy vấn sau

>>>

cursor = connection.cursor()
16

Nếu bạn không muốn sử dụng mệnh đề

cursor = connection.cursor()
123 và bạn không cần tìm nạp tất cả các bản ghi, thì đối tượng
cursor = connection.cursor()
39 cũng có các phương thức
cursor = connection.cursor()
139 và
cursor = connection.cursor()
140

  • cursor = connection.cursor()
    
    139 truy xuất hàng tiếp theo của kết quả, dưới dạng một bộ hoặc
    cursor = connection.cursor()
    
    142 nếu không còn hàng nào nữa
  • cursor = connection.cursor()
    
    140 truy xuất tập hợp các hàng tiếp theo từ kết quả dưới dạng danh sách các bộ dữ liệu. Nó có đối số
    cursor = connection.cursor()
    
    144, mặc định là
    cursor = connection.cursor()
    
    063, mà bạn có thể sử dụng để chỉ định số lượng hàng bạn cần tìm nạp. Nếu không còn hàng nào nữa thì phương thức trả về một danh sách trống

Hãy thử truy xuất lại tiêu đề của năm bộ phim có doanh thu cao nhất nối với năm phát hành của chúng, nhưng lần này hãy sử dụng

cursor = connection.cursor()
140

>>>

cursor = connection.cursor()
17

Đầu ra với

cursor = connection.cursor()
140 tương tự như những gì bạn nhận được khi bạn sử dụng mệnh đề
cursor = connection.cursor()
123. Bạn có thể đã nhận thấy cuộc gọi bổ sung
cursor = connection.cursor()
050 ở cuối. Bạn làm điều này để xóa tất cả các kết quả còn lại mà
cursor = connection.cursor()
140 chưa đọc

Cần phải xóa tất cả các kết quả chưa đọc trước khi thực hiện bất kỳ câu lệnh nào khác trên cùng một kết nối. Nếu không, một ngoại lệ

cursor = connection.cursor()
151 sẽ được đưa ra

Loại bỏ các quảng cáo

Xử lý nhiều bảng bằng câu lệnh cursor = connection.cursor() 5

Nếu bạn thấy các truy vấn trong phần trước khá đơn giản, đừng lo lắng. Bạn có thể thực hiện các truy vấn

cursor = connection.cursor()
2 của mình phức tạp như bạn muốn bằng cách sử dụng các phương pháp tương tự từ phần trước

Hãy xem xét một số truy vấn

cursor = connection.cursor()
5 phức tạp hơn một chút. Nếu bạn muốn tìm tên của năm bộ phim được xếp hạng cao nhất trong cơ sở dữ liệu của mình, thì bạn có thể chạy truy vấn sau

>>>

cursor = connection.cursor()
18

Như đã trình bày ở trên, Night of the Living Dead và The Godfather được xếp hạng cao nhất trong cơ sở dữ liệu

cursor = connection.cursor()
79 của bạn

Để tìm tên của người đánh giá đã xếp hạng nhiều nhất, hãy viết truy vấn sau

>>>

cursor = connection.cursor()
19

cursor = connection.cursor()
156 là người đánh giá thường xuyên nhất trong cơ sở dữ liệu này. Như đã thấy ở trên, truy vấn phức tạp đến mức nào không quan trọng bởi vì nó cuối cùng được xử lý bởi máy chủ MySQL. Quá trình thực hiện truy vấn của bạn sẽ luôn giữ nguyên. chuyển truy vấn tới
cursor = connection.cursor()
76 và lấy kết quả bằng cách sử dụng
cursor = connection.cursor()
122

Cập nhật và xóa bản ghi khỏi cơ sở dữ liệu

Trong phần này, bạn sẽ cập nhật và xóa các bản ghi khỏi cơ sở dữ liệu. Cả hai thao tác này đều có thể được thực hiện trên một bản ghi hoặc nhiều bản ghi trong bảng. Bạn sẽ chọn các hàng cần sửa đổi bằng cách sử dụng mệnh đề

cursor = connection.cursor()
133

Lệnh cursor = connection.cursor() 160

Một trong những người đánh giá trong cơ sở dữ liệu của bạn,

cursor = connection.cursor()
161, hiện đã kết hôn với
cursor = connection.cursor()
162. Họ của cô ấy hiện đã đổi thành
cursor = connection.cursor()
163, vì vậy bạn cần cập nhật cơ sở dữ liệu của mình cho phù hợp. Để cập nhật bản ghi, MySQL sử dụng câu lệnh
cursor = connection.cursor()
160

cursor = connection.cursor()
80

Mã chuyển truy vấn cập nhật tới

cursor = connection.cursor()
76 và
cursor = connection.cursor()
104 mang các thay đổi cần thiết vào bảng
cursor = connection.cursor()
005

Ghi chú. Trong truy vấn

cursor = connection.cursor()
160, mệnh đề
cursor = connection.cursor()
133 giúp chỉ định các bản ghi cần được cập nhật. Nếu bạn không sử dụng
cursor = connection.cursor()
133 thì tất cả các bản ghi sẽ được cập nhật

Giả sử bạn cần cung cấp tùy chọn cho phép người đánh giá sửa đổi xếp hạng. Người đánh giá sẽ cung cấp ba giá trị,

cursor = connection.cursor()
010,
cursor = connection.cursor()
011 và
cursor = connection.cursor()
012 mới. Mã sẽ hiển thị bản ghi sau khi thực hiện sửa đổi được chỉ định

Giả sử rằng

cursor = connection.cursor()
174,
cursor = connection.cursor()
175 và
cursor = connection.cursor()
176 mới, bạn có thể sử dụng các truy vấn MySQL sau để thực hiện sửa đổi cần thiết

cursor = connection.cursor()
81

Các truy vấn trên đầu tiên cập nhật xếp hạng và sau đó hiển thị nó. Bạn có thể tạo một tập lệnh Python hoàn chỉnh để thiết lập kết nối với cơ sở dữ liệu và cho phép người đánh giá sửa đổi xếp hạng

cursor = connection.cursor()
82

Lưu mã này vào tệp có tên

cursor = connection.cursor()
177. Đoạn mã trên sử dụng trình giữ chỗ
cursor = connection.cursor()
110 để chèn đầu vào nhận được vào chuỗi
cursor = connection.cursor()
179. Lần đầu tiên trong hướng dẫn này, bạn có nhiều truy vấn bên trong một chuỗi. Để chuyển nhiều truy vấn tới một
cursor = connection.cursor()
76, bạn cần đặt đối số
cursor = connection.cursor()
181 của phương thức thành
cursor = connection.cursor()
182

Nếu

cursor = connection.cursor()
181 là
cursor = connection.cursor()
182, thì
cursor = connection.cursor()
76 trả về một trình vòng lặp. Mỗi mục trong trình vòng lặp tương ứng với một đối tượng
cursor = connection.cursor()
39 thực thi một câu lệnh được truyền trong truy vấn. Đoạn mã trên chạy một vòng lặp
cursor = connection.cursor()
0 trên iterator này và sau đó gọi
cursor = connection.cursor()
122 trên mỗi đối tượng
cursor = connection.cursor()
39

Ghi chú. Chạy

cursor = connection.cursor()
122 trên tất cả các đối tượng con trỏ là quan trọng. Để thực hiện một câu lệnh mới trên cùng một kết nối, bạn phải đảm bảo rằng không có kết quả chưa đọc từ các lần thực hiện trước đó. Nếu có kết quả chưa đọc, thì bạn sẽ nhận được một ngoại lệ

Nếu không có tập kết quả nào được tìm nạp trong một thao tác, thì

cursor = connection.cursor()
122 sẽ đưa ra một ngoại lệ. Để tránh lỗi này, trong đoạn mã trên, bạn sử dụng thuộc tính
cursor = connection.cursor()
192, thuộc tính này cho biết liệu thao tác được thực hiện gần đây nhất có tạo ra các hàng hay không

Mặc dù mã này sẽ giải quyết được mục đích của bạn, nhưng mệnh đề

cursor = connection.cursor()
133 là mục tiêu chính của tin tặc web ở trạng thái hiện tại. Nó dễ bị tổn thương trước cái được gọi là tấn công SQL injection, có thể cho phép các tác nhân độc hại làm hỏng hoặc lạm dụng cơ sở dữ liệu của bạn

Cảnh báo. Đừng thử các đầu vào bên dưới trên cơ sở dữ liệu của bạn. Họ sẽ làm hỏng bảng của bạn và bạn sẽ cần phải tạo lại nó

Ví dụ: nếu người dùng gửi

cursor = connection.cursor()
194,
cursor = connection.cursor()
195 và
cursor = connection.cursor()
196 mới làm đầu vào, thì đầu ra sẽ như thế này

cursor = connection.cursor()
83

cursor = connection.cursor()
012 với
cursor = connection.cursor()
194 và
cursor = connection.cursor()
195 đã được đổi thành
cursor = connection.cursor()
800. Nhưng nếu bạn là hacker, thì bạn có thể gửi một lệnh ẩn trong đầu vào của mình

cursor = connection.cursor()
84

Một lần nữa, đầu ra cho thấy rằng

cursor = connection.cursor()
012 được chỉ định đã được thay đổi thành
cursor = connection.cursor()
800. Điều gì đã thay đổi?

Tin tặc đã lẻn truy vấn cập nhật khi đang truy cập vào

cursor = connection.cursor()
011. Truy vấn cập nhật,
cursor = connection.cursor()
804, thay đổi
cursor = connection.cursor()
008 của tất cả các bản ghi trong bảng
cursor = connection.cursor()
005 thành
cursor = connection.cursor()
807. Bạn có thể thấy sự thay đổi này nếu in bảng
cursor = connection.cursor()
005 ra

>>>

cursor = connection.cursor()
85

Đoạn mã trên hiển thị

cursor = connection.cursor()
007 và
cursor = connection.cursor()
008 cho tất cả các bản ghi trong bảng
cursor = connection.cursor()
005. Cuộc tấn công SQL injection đã làm hỏng bảng này bằng cách thay đổi
cursor = connection.cursor()
008 của tất cả các bản ghi thành
cursor = connection.cursor()
807

Có một cách khắc phục nhanh để ngăn chặn các cuộc tấn công như vậy. Không thêm trực tiếp các giá trị truy vấn do người dùng cung cấp vào chuỗi truy vấn của bạn. Thay vào đó, hãy cập nhật tập lệnh

cursor = connection.cursor()
177 để gửi các giá trị truy vấn này dưới dạng đối số tới
cursor = connection.cursor()
085

cursor = connection.cursor()
86

Lưu ý rằng các trình giữ chỗ

cursor = connection.cursor()
110 không còn trong dấu ngoặc kép. Các chuỗi được chuyển đến trình giữ chỗ có thể chứa một số ký tự đặc biệt. Nếu cần, chúng có thể được thoát chính xác bởi thư viện bên dưới

cursor = connection.cursor()
76 đảm bảo rằng các giá trị trong bộ nhận được dưới dạng đối số thuộc loại dữ liệu bắt buộc. Nếu người dùng cố gắng nhập một số ký tự có vấn đề, thì mã sẽ đưa ra một ngoại lệ

cursor = connection.cursor()
87

cursor = connection.cursor()
76 sẽ đưa ra một ngoại lệ nếu nó tìm thấy bất kỳ ký tự không mong muốn nào trong đầu vào của người dùng. Bạn nên sử dụng phương pháp này bất cứ khi nào bạn kết hợp đầu vào của người dùng trong một truy vấn. Có nhiều cách khác để ngăn chặn các cuộc tấn công SQL injection

Loại bỏ các quảng cáo

Lệnh cursor = connection.cursor() 819

Xóa hồ sơ hoạt động rất giống với cập nhật hồ sơ. Bạn sử dụng câu lệnh

cursor = connection.cursor()
819 để xóa các bản ghi đã chọn

Ghi chú. Xóa là một quá trình không thể đảo ngược. Nếu bạn không sử dụng mệnh đề

cursor = connection.cursor()
133 thì tất cả các bản ghi từ bảng đã chỉ định sẽ bị xóa. Bạn sẽ cần chạy lại truy vấn
cursor = connection.cursor()
089 để lấy lại các bản ghi đã xóa

Trước tiên, bạn nên chạy truy vấn

cursor = connection.cursor()
2 với cùng một bộ lọc để đảm bảo rằng bạn đang xóa đúng bản ghi. Ví dụ: để xóa tất cả các xếp hạng do
cursor = connection.cursor()
824 đưa ra, trước tiên bạn nên chạy truy vấn
cursor = connection.cursor()
2 tương ứng

>>>

cursor = connection.cursor()
88

Đoạn mã trên xuất ra

cursor = connection.cursor()
011 và
cursor = connection.cursor()
010 cho các bản ghi trong bảng
cursor = connection.cursor()
009 trong đó
cursor = connection.cursor()
824. Khi bạn đã xác nhận rằng đây là những bản ghi mà bạn cần xóa, bạn có thể chạy truy vấn
cursor = connection.cursor()
819 với cùng một bộ lọc

cursor = connection.cursor()
89

Với truy vấn này, bạn xóa tất cả xếp hạng do người đánh giá đưa ra với

cursor = connection.cursor()
824 khỏi bảng
cursor = connection.cursor()
009

Các cách khác để kết nối Python và MySQL

Trong hướng dẫn này, bạn đã thấy MySQL Connector/Python, đây là phương tiện được đề xuất chính thức để tương tác với cơ sở dữ liệu MySQL từ ứng dụng Python. Có hai trình kết nối phổ biến khác

  1. mysqlclient là một thư viện cạnh tranh trực tiếp với trình kết nối chính thức và được cập nhật tích cực với các tính năng mới. Bởi vì lõi của nó được viết bằng C, nên nó có hiệu suất tốt hơn trình kết nối chính thức thuần Python. Một nhược điểm lớn là khá khó thiết lập và cài đặt, đặc biệt là trên Windows

  2. MySQLdb là một phần mềm cũ vẫn được sử dụng trong các ứng dụng thương mại. Nó được viết bằng C và nhanh hơn MySQL Connector/Python nhưng chỉ có sẵn cho Python 2

Các trình kết nối này đóng vai trò là giao diện giữa chương trình của bạn và cơ sở dữ liệu MySQL và bạn gửi các truy vấn SQL của mình thông qua chúng. Nhưng nhiều nhà phát triển thích sử dụng mô hình hướng đối tượng hơn là truy vấn SQL để thao tác dữ liệu

Ánh xạ quan hệ đối tượng (ORM) là một kỹ thuật cho phép bạn truy vấn và thao tác dữ liệu từ cơ sở dữ liệu trực tiếp bằng ngôn ngữ hướng đối tượng. Thư viện ORM đóng gói mã cần thiết để thao tác dữ liệu, giúp loại bỏ nhu cầu sử dụng dù chỉ một chút SQL. Dưới đây là các ORM Python phổ biến nhất cho cơ sở dữ liệu dựa trên SQL

  1. SQLAlchemy là một ORM hỗ trợ giao tiếp giữa Python và các cơ sở dữ liệu SQL khác. Bạn có thể tạo các công cụ khác nhau cho các cơ sở dữ liệu khác nhau như MySQL, PostgreSQL, SQLite, v.v. SQLAlchemy thường được sử dụng cùng với thư viện pandas để cung cấp chức năng xử lý dữ liệu hoàn chỉnh

  2. peewee là một ORM nhẹ và nhanh, thiết lập nhanh chóng. Điều này khá hữu ích khi tương tác của bạn với cơ sở dữ liệu bị giới hạn trong việc trích xuất một vài bản ghi. Ví dụ: nếu bạn cần sao chép các bản ghi đã chọn từ cơ sở dữ liệu MySQL sang tệp CSV, thì peewee có thể là lựa chọn tốt nhất của bạn

  3. Django ORM là một trong những tính năng mạnh mẽ nhất của Django và được cung cấp cùng với khung web Django. Nó có thể tương tác với nhiều loại cơ sở dữ liệu như SQLite, PostgreSQL và MySQL. Nhiều ứng dụng dựa trên Django sử dụng Django ORM để mô hình hóa dữ liệu và truy vấn cơ bản nhưng thường chuyển sang SQLAlchemy cho các yêu cầu phức tạp hơn

Bạn có thể tìm thấy một trong những cách tiếp cận này phù hợp hơn cho ứng dụng của mình. Nếu bạn không chắc chắn nên sử dụng cái nào, thì tốt nhất nên sử dụng Trình kết nối/Python MySQL được đề xuất chính thức mà bạn đã thấy trong hướng dẫn này

Phần kết luận

Trong hướng dẫn này, bạn đã biết cách sử dụng MySQL Connector/Python để tích hợp cơ sở dữ liệu MySQL với ứng dụng Python của bạn. Bạn cũng đã thấy một số tính năng độc đáo của cơ sở dữ liệu MySQL giúp phân biệt nó với các cơ sở dữ liệu SQL khác

Đồng thời, bạn đã học được một số phương pháp hay nhất về lập trình đáng để xem xét khi thiết lập kết nối, tạo bảng cũng như chèn và cập nhật bản ghi trong ứng dụng cơ sở dữ liệu. Bạn cũng đã phát triển cơ sở dữ liệu MySQL mẫu cho hệ thống xếp hạng phim trực tuyến và tương tác với nó trực tiếp từ ứng dụng Python của bạn

Trong hướng dẫn này, bạn đã học cách

  • Kết nối ứng dụng Python của bạn với cơ sở dữ liệu MySQL
  • Mang dữ liệu từ cơ sở dữ liệu MySQL vào Python để phân tích thêm
  • Thực thi các truy vấn SQL từ ứng dụng Python của bạn
  • Xử lý ngoại lệ khi truy cập cơ sở dữ liệu
  • Ngăn chặn các cuộc tấn công SQL injection vào ứng dụng của bạn

Nếu bạn quan tâm, Python cũng có các trình kết nối cho các DBMS khác như MongoDB và PostgreSQL. Để biết thêm thông tin, hãy xem Hướng dẫn cơ sở dữ liệu Python

Đánh dấu là đã hoàn thành

🐍 Thủ thuật Python 💌

Nhận một Thủ thuật Python ngắn và hấp dẫn được gửi đến hộp thư đến của bạn vài ngày một lần. Không có thư rác bao giờ. Hủy đăng ký bất cứ lúc nào. Được quản lý bởi nhóm Real Python

Python có thể quản lý cơ sở dữ liệu không?

Gửi cho tôi thủ thuật Python »

Giới thiệu về Chaitanya Baweja

Python có thể quản lý cơ sở dữ liệu không?
Python có thể quản lý cơ sở dữ liệu không?

Chaitanya là một Pythonista cuồng nhiệt và viết cho Real Python

» Tìm hiểu thêm về Chaitanya


Mỗi hướng dẫn tại Real Python được tạo bởi một nhóm các nhà phát triển để nó đáp ứng các tiêu chuẩn chất lượng cao của chúng tôi. Các thành viên trong nhóm đã làm việc trong hướng dẫn này là

Python có thể quản lý cơ sở dữ liệu không?

Aldren

Python có thể quản lý cơ sở dữ liệu không?

Bartosz

Python có thể quản lý cơ sở dữ liệu không?

Geir Arne

Python có thể quản lý cơ sở dữ liệu không?

Joanna

Python có thể quản lý cơ sở dữ liệu không?

Gia-cốp

Bậc thầy Kỹ năng Python trong thế giới thực Với quyền truy cập không giới hạn vào Python thực

Python có thể quản lý cơ sở dữ liệu không?

Tham gia với chúng tôi và có quyền truy cập vào hàng nghìn hướng dẫn, khóa học video thực hành và cộng đồng các Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bậc thầy Kỹ năng Python trong thế giới thực
Với quyền truy cập không giới hạn vào Python thực

Tham gia với chúng tôi và có quyền truy cập vào hàng ngàn hướng dẫn, khóa học video thực hành và cộng đồng Pythonistas chuyên gia

Nâng cao kỹ năng Python của bạn »

Bạn nghĩ sao?

Đánh giá bài viết này

Tweet Chia sẻ Chia sẻ Email

Bài học số 1 hoặc điều yêu thích mà bạn đã học được là gì?

Mẹo bình luận. Những nhận xét hữu ích nhất là những nhận xét được viết với mục đích học hỏi hoặc giúp đỡ các sinh viên khác. Nhận các mẹo để đặt câu hỏi hay và nhận câu trả lời cho các câu hỏi phổ biến trong cổng thông tin hỗ trợ của chúng tôi