Python 3 – Truy cập cơ sở dữ liệu MySQL – ví dụ về mysqldb python 3

Python 3 – Truy cập cơ sở dữ liệu MySQL, Tiêu chuẩn Python cho giao diện cơ sở dữ liệu là Python DB-API. Hầu hết các giao diện cơ sở dữ liệu Python đều tuân theo tiêu chuẩn này.

Bạn đang xem : Ví dụ về mysqldb python 3

Python 3 – Truy cập cơ sở dữ liệu MySQL

Quảng cáo

Tiêu chuẩn Python cho giao diện cơ sở dữ liệu là Python DB-API. Hầu hết các giao diện cơ sở dữ liệu Python đều tuân theo tiêu chuẩn này.

Bạn có thể chọn cơ sở dữ liệu phù hợp cho ứng dụng của mình. API cơ sở dữ liệu Python hỗ trợ một loạt các máy chủ cơ sở dữ liệu như –

  • GadFly
  • mSQL
  • MySQL
  • PostgreSQL
  • Microsoft SQL Server 2000
  • Informix
  • Interbase
  • Oracle
  • Sybase
  • SQLite

Đây là danh sách các giao diện cơ sở dữ liệu Python có sẵn – Giao diện và API cơ sở dữ liệu Python . Bạn phải tải xuống mô-đun API DB riêng biệt cho từng cơ sở dữ liệu mà bạn cần truy cập. Ví dụ: nếu bạn cần truy cập cơ sở dữ liệu Oracle cũng như cơ sở dữ liệu MySQL, bạn phải tải xuống cả mô-đun cơ sở dữ liệu Oracle và MySQL.

API DB cung cấp một tiêu chuẩn tối thiểu để làm việc với cơ sở dữ liệu bằng cách sử dụng cấu trúc và cú pháp Python nếu có thể. API này bao gồm những điều sau –

  • Nhập mô-đun API.
  • Có được kết nối với cơ sở dữ liệu.
  • Phát hành các câu lệnh SQL và các thủ tục được lưu trữ.
  • Đang đóng kết nối

Python có hỗ trợ tích hợp cho SQLite. Trong phần này, chúng ta sẽ tìm hiểu tất cả các khái niệm sử dụng MySQL. Mô-đun MySQLdb, một giao diện phổ biến với MySQL không tương thích với Python 3. Thay vào đó, chúng tôi sẽ sử dụng mô-đun PyMySQL .

PyMySQL là gì?

PyMySQL là một giao diện để kết nối với máy chủ cơ sở dữ liệu MySQL từ Python. Nó triển khai API cơ sở dữ liệu Python v2.0 và chứa thư viện khách MySQL thuần Python. Mục tiêu của PyMySQL là thay thế MySQLdb.

Làm cách nào để cài đặt PyMySQL?

Trước khi tiếp tục, bạn đảm bảo rằng bạn đã cài đặt PyMySQL trên máy của mình. Chỉ cần nhập đoạn mã sau vào tập lệnh Python của bạn và thực thi nó –

#! / usr / bin / python3

nhập pymysql

Nếu nó tạo ra kết quả sau thì điều đó có nghĩa là mô-đun MySQLdb chưa được cài đặt –

Traceback (cuộc gọi gần đây nhất cuối cùng):
   Tệp "test.py", dòng 3, trong & lt; mô-đun & gt;
      Nhập pymysql
ImportError: Không có mô-đun nào có tên pymysql

Bản phát hành ổn định cuối cùng có sẵn trên PyPI và có thể được cài đặt bằng pip –

pip cài đặt pymysql

Ngoài ra (ví dụ: nếu không có pip), có thể tải xuống tarball từ GitHub và được cài đặt với Setuptools như sau –

$ # X.X là phiên bản pymysql mong muốn (ví dụ: 0,5 hoặc 0,6).
$ curl -L https://github.com/PyMySQL/PyMySQL/tarball/pymysql-X.X | tar xz
$ cd PyMySQL *
$ python setup.py cài đặt
$ # Thư mục PyMySQL * có thể được gỡ bỏ một cách an toàn ngay bây giờ.

Lưu ý – Đảm bảo rằng bạn có đặc quyền root để cài đặt mô-đun trên.

Kết nối cơ sở dữ liệu

Trước khi kết nối với cơ sở dữ liệu MySQL, hãy đảm bảo các điểm sau –

  • Bạn đã tạo một cơ sở dữ liệu TESTDB.

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

  • Bảng này có các trường FIRST_NAME, LAST_NAME, AGE, SEX và THU NHẬP.

  • User ID “testuser” và mật khẩu “test123” được đặt để truy cập TESTDB.

  • Mô-đun Python PyMySQL được cài đặt đúng cách trên máy của bạn.

  • Bạn đã xem qua hướng dẫn về MySQL để hiểu Cơ bản về MySQL.

Ví dụ

Sau đây là một ví dụ về kết nối với cơ sở dữ liệu MySQL “TESTDB” –

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng phương thức
con trỏ = db.cursor ()

# thực thi truy vấn SQL bằng phương pháp.
cursor.execute ("CHỌN PHIÊN BẢN ()")

# Tìm nạp một hàng bằng phương pháp.
data = cursor.fetchone ()
print ("Phiên bản cơ sở dữ liệu:% s"% data)

# ngắt kết nối khỏi máy chủ
db.close ()

Trong khi chạy tập lệnh này, nó tạo ra kết quả sau.

Phiên bản cơ sở dữ liệu: 5.5.20-log

Nếu kết nối được thiết lập với nguồn dữ liệu, thì Đối tượng kết nối sẽ được trả về và lưu vào db để sử dụng thêm, nếu không thì db được đặt thành Không. Tiếp theo, đối tượng db được sử dụng để tạo đối tượng con trỏ , đối tượng này được sử dụng để thực thi các truy vấn SQL. Cuối cùng, trước khi xuất hiện, nó đảm bảo rằng kết nối cơ sở dữ liệu đã đóng và tài nguyên được giải phóng.

Xem Thêm  Làm thế nào để gọi hàm PHP khi nhấp vào một nút? - gọi hàm php từ html

Tạo bảng cơ sở dữ liệu

Sau khi kết nối cơ sở dữ liệu được thiết lập, chúng tôi đã sẵn sàng tạo bảng hoặc bản ghi vào bảng cơ sở dữ liệu bằng cách sử dụng phương thức thực thi của con trỏ đã tạo.

Ví dụ

Hãy để chúng tôi tạo bảng Cơ sở dữ liệu NHÂN VIÊN –

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng phương thức
con trỏ = db.cursor ()

# Bỏ bảng nếu nó đã tồn tại bằng phương pháp.
cursor.execute ("BẢNG DROP NẾU CÓ NHÂN VIÊN")

# Tạo bảng theo yêu cầu
sql = "" "NHÂN VIÊN TẠO BẢNG (
   FIRST_NAME CHAR (20) KHÔNG ĐỦ,
   LAST_NAME CHAR (20),
   TUỔI INT,
   CHAR TÌNH DỤC (1),
   THU NHẬP NỔI BẬT) "" "

cursor.execute (sql)

# ngắt kết nối khỏi máy chủ
db.close ()

Thao tác INSERT

Thao tác INSERT là bắt buộc khi bạn muốn tạo bản ghi của mình vào một bảng cơ sở dữ liệu.

Ví dụ

Ví dụ sau, thực thi câu lệnh SQL để tạo bản ghi trong bảng EMPLOYEE –

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng cách sử dụng phương thức cursor ()
con trỏ = db.cursor ()

# Chuẩn bị truy vấn SQL để CHÈN một bản ghi vào cơ sở dữ liệu.
sql = "" "CHÈN VÀO NHÂN VIÊN (FIRST_NAME,
   LAST_NAME, TUỔI, TÌNH DỤC, THU NHẬP)
   VALUES ('Mac', 'Mohan', 20, 'M', 2000) "" "
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Cam kết các thay đổi của bạn trong cơ sở dữ liệu
   db.commit ()
ngoại trừ:
   # Khôi phục trong trường hợp có bất kỳ lỗi nào
   db.rollback ()

# ngắt kết nối khỏi máy chủ
db.close ()

Ví dụ trên có thể được viết như sau để tạo các truy vấn SQL động –

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng cách sử dụng phương thức cursor ()
con trỏ = db.cursor ()

# Chuẩn bị truy vấn SQL để CHÈN một bản ghi vào cơ sở dữ liệu.
sql = "CHÈN VÀO NHÂN VIÊN (FIRST_NAME, \
   LAST_NAME, TUỔI, SEX, THU NHẬP) \
   GIÁ TRỊ ('% s', '% s', '% d', '% c', '% d') "% \
   ('Mac', 'Mohan', 20, 'M', 2000)
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Cam kết các thay đổi của bạn trong cơ sở dữ liệu
   db.commit ()
ngoại trừ:
   # Khôi phục trong trường hợp có bất kỳ lỗi nào
   db.rollback ()

# ngắt kết nối khỏi máy chủ
db.close ()

Ví dụ

Đoạn mã sau là một dạng thực thi khác mà bạn có thể truyền trực tiếp các tham số –

..................................
user_id = "test123"
password = "mật khẩu"

con.execute ('chèn vào giá trị Đăng nhập ("% s", "% s")'% \
             (user_id, mật khẩu))
..................................

READ hoạt động

ĐỌC Hoạt động trên bất kỳ cơ sở dữ liệu nào có nghĩa là lấy một số thông tin hữu ích từ cơ sở dữ liệu.

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

  • fetchone () – Nó tìm nạp hàng tiếp theo của tập hợp kết quả truy vấn. Tập kết quả là một đối tượng được trả về khi đối tượng con trỏ được sử dụng để truy vấn bảng.

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

  • rowcount – Đây là thuộc tính chỉ đọc và trả về số lượng hàng bị ảnh hưởng bởi phương thức execute ().

Ví dụ

Quy trình sau đây truy vấn tất cả các bản ghi từ bảng EMPLOYEE có mức lương hơn 1000 –

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng cách sử dụng phương thức cursor ()
con trỏ = db.cursor ()

# Chuẩn bị truy vấn SQL để CHÈN một bản ghi vào cơ sở dữ liệu.
sql = "CHỌN * TỪ NHÂN VIÊN \
      THU NHẬP Ở ĐÂU & gt; '% d' "% (1000)
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Tìm nạp tất cả các hàng trong danh sách các danh sách.
   results = cursor.fetchall ()
   cho hàng trong kết quả:
      fname = row [0]
      lname = row [1]
      age = row [2]
      sex = row [3]
      thu nhập = hàng [4]
      # Bây giờ in kết quả đã tìm nạp
      print ("fname =% s, lname =% s, age =% d, sex =% s, thu nhập =% d"% \
         (họ, tên, tuổi, giới tính, thu nhập))
ngoại trừ:
   print ("Lỗi: không thể tìm nạp dữ liệu")

# ngắt kết nối khỏi máy chủ
db.close ()

Đầu ra

Điều này sẽ tạo ra kết quả sau –

fname = Mac, lname = Mohan, age = 20, sex = M, thu nhập = 2000

Thao tác cập nhật

CẬP NHẬT Thao tác trên bất kỳ cơ sở dữ liệu nào có nghĩa là cập nhật một hoặc nhiều bản ghi đã có sẵn trong cơ sở dữ liệu.

Xem Thêm  Thả tất cả các bảng SQL Server - thả tất cả bảng trong sql

Quy trình sau đây cập nhật tất cả các bản ghi có SEX là ‘M’ . Ở đây, chúng tôi tăng TUỔI của tất cả nam giới lên một năm.

Ví dụ

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng phương thức
con trỏ = db.cursor ()

# Chuẩn bị truy vấn SQL để CẬP NHẬT các bản ghi bắt buộc
sql = "CẬP NHẬT NHÂN VIÊN ĐẶT TUỔI = TUỔI + 1
                          WHERE SEX = '% c' "% ('M')
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Cam kết các thay đổi của bạn trong cơ sở dữ liệu
   db.commit ()
ngoại trừ:
   # Khôi phục trong trường hợp có bất kỳ lỗi nào
   db.rollback ()

# ngắt kết nối khỏi máy chủ
db.close ()

Thao tác DELETE

Thao tác DELETE là bắt buộc khi bạn muốn xóa một số bản ghi khỏi cơ sở dữ liệu của mình. Sau đây là quy trình xóa tất cả các bản ghi khỏi NHÂN VIÊN có TUỔI trên 20 –

Ví dụ

#! / usr / bin / python3

nhập pymysql

# Mở kết nối cơ sở dữ liệu
db = pymysql.connect ("localhost", "testuser", "test123", "TESTDB")

# chuẩn bị một đối tượng con trỏ bằng phương thức
con trỏ = db.cursor ()

# Chuẩn bị truy vấn SQL để XÓA các bản ghi bắt buộc
sql = "XÓA NHÂN VIÊN Ở ĐÂU TUỔI & gt; '% d'"% (20)
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Cam kết các thay đổi của bạn trong cơ sở dữ liệu
   db.commit ()
ngoại trừ:
   # Khôi phục trong trường hợp có bất kỳ lỗi nào
   db.rollback ()

# ngắt kết nối khỏi máy chủ
db.close ()

Thực hiện giao dịch

Giao dịch là một cơ chế đảm bảo tính nhất quán của dữ liệu. Các giao dịch có bốn thuộc tính sau –

  • Tính nguyên tử – Giao dịch hoàn tất hoặc không có gì xảy ra cả.

  • Nhất quán – Một giao dịch phải bắt đầu ở trạng thái nhất quán và để hệ thống ở trạng thái nhất quán.

  • Cách ly – Kết quả trung gian của một giao dịch không hiển thị bên ngoài giao dịch hiện tại.

  • Độ bền – Sau khi giao dịch được cam kết, các ảnh hưởng sẽ tồn tại dai dẳng, ngay cả sau khi hệ thống bị lỗi.

Python DB API 2.0 cung cấp hai phương thức cho một hoặc một giao dịch.

Ví dụ

Bạn đã biết cách triển khai các giao dịch. Đây là một ví dụ tương tự –

# Chuẩn bị truy vấn SQL để XÓA các bản ghi bắt buộc
sql = "XÓA NHÂN VIÊN Ở ĐÂU TUỔI & gt; '% d'"% (20)
thử:
   # Thực thi lệnh SQL
   cursor.execute (sql)
   # Cam kết các thay đổi của bạn trong cơ sở dữ liệu
   db.commit ()
ngoại trừ:
   # Khôi phục trong trường hợp có bất kỳ lỗi nào
   db.rollback ()

Hoạt động CAM KẾT

Cam kết là một thao tác đưa ra tín hiệu xanh cho cơ sở dữ liệu để hoàn tất các thay đổi và sau thao tác này, không thể hoàn nguyên thay đổi nào.

Đây là một ví dụ đơn giản để gọi phương thức cam kết .

db.commit ()

Hoạt động ROLLBACK

Nếu bạn không hài lòng với một hoặc nhiều thay đổi và bạn muốn hoàn nguyên hoàn toàn những thay đổi đó, hãy sử dụng phương pháp rollback () .

Đây là một ví dụ đơn giản để gọi phương thức rollback () .

db.rollback ()

Ngắt kết nối cơ sở dữ liệu

Để ngắt kết nối Cơ sở dữ liệu, hãy sử dụng phương thức close ().

db.close ()

Nếu người dùng đóng kết nối với cơ sở dữ liệu bằng phương thức close (), thì bất kỳ giao dịch nào chưa hoàn thành sẽ được DB khôi phục. Tuy nhiên, thay vì phụ thuộc vào bất kỳ chi tiết triển khai cấp thấp hơn nào của DB, ứng dụng của bạn tốt hơn nên gọi cam kết hoặc khôi phục một cách rõ ràng.

Xử lý lỗi

Có nhiều nguồn lỗi. Một vài ví dụ là lỗi cú pháp trong câu lệnh SQL đã thực thi, lỗi kết nối hoặc gọi phương thức tìm nạp cho một lệnh xử lý câu lệnh đã bị hủy hoặc đã hoàn thành.

API DB xác định một số lỗi phải tồn tại trong mỗi mô-đun cơ sở dữ liệu. Bảng sau liệt kê những trường hợp ngoại lệ này.

Xem Thêm  Mảng trong C / C ++ - xác định một mảng trong c

Sr.No.
Ngoại lệ & amp; Sự mô tả

1

Cảnh báo

Được sử dụng cho các sự cố không nghiêm trọng. Phải phân lớp StandardError.

2

Lỗi

Lớp cơ sở cho các lỗi. Phải phân lớp StandardError.

3

InterfaceError

Được sử dụng cho các lỗi trong mô-đun cơ sở dữ liệu, không phải chính cơ sở dữ liệu. Lỗi phải phân lớp.

4

DatabaseError

Được sử dụng cho các lỗi trong cơ sở dữ liệu. Lỗi phải phân lớp.

5

DataError

Lớp con của DatabaseError đề cập đến lỗi trong dữ liệu.

6

OperationalError

Lớp con của DatabaseError đề cập đến các lỗi như mất kết nối với cơ sở dữ liệu. Những lỗi này thường nằm ngoài tầm kiểm soát của trình mã Python.

7

IntegrityError

Lớp con của DatabaseError đối với các tình huống có thể làm hỏng tính toàn vẹn của quan hệ, chẳng hạn như các ràng buộc về tính duy nhất hoặc khóa ngoại.

số 8

InternalError

Lớp con của DatabaseError đề cập đến các lỗi bên trong mô-đun cơ sở dữ liệu, chẳng hạn như con trỏ không còn hoạt động.

9

Lỗi Lập trình

Lớp con của DatabaseError đề cập đến các lỗi như tên bảng không hợp lệ và những thứ khác có thể đổ lỗi cho bạn một cách an toàn.

10

NotSupportedError

Lớp con của DatabaseError đề cập đến việc cố gắng gọi chức năng không được hỗ trợ.

Các tập lệnh Python của bạn phải xử lý các lỗi này, nhưng trước khi sử dụng bất kỳ ngoại lệ nào ở trên, hãy đảm bảo MySQLdb của bạn có hỗ trợ cho ngoại lệ đó. Bạn có thể biết thêm thông tin về chúng bằng cách đọc thông số kỹ thuật của DB API 2.0.

Quảng cáo


Xem thêm những thông tin liên quan đến chủ đề ví dụ về mysqldb python 3

Python MySQL Tutorial – Setup & Basic Queries (w/ MySQL Connector)

  • Tác giả: Tech With Tim
  • Ngày đăng: 2019-10-04
  • Đánh giá: 4 ⭐ ( 4606 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Learn how to use MySQL and SQL with python. In this series I will show you how to use the python mysql connector to create tables, insert data and work with a MySQL database.

    MySQL is a relational database management system. It is a great tool to learn how to use and will allow you to demonstrate your experience with RDBMS to future employers. (Employers usually require you know SQL!!)

    Links:
    MySQL: https://dev.mysql.com/downloads/installer/
    Python Connector: https://dev.mysql.com/downloads/connector/python/

    Playlist: https://www.youtube.com/watch?v=3vsC05rxZ8c&list=PLzMcBGfZo4-l5kVSNVKGO60V6RkXAVtp-

    ◾◾◾◾◾
    💻 Enroll in The Fundamentals of Programming w/ Python
    https://tech-with-tim.teachable.com/p…

    📸 Instagram: https://www.instagram.com/tech_with_tim
    🌎 Website https://techwithtim.net
    📱 Twitter: https://twitter.com/TechWithTimm
    ⭐ Discord: https://discord.gg/pr2k55t
    📝 LinkedIn: https://www.linkedin.com/in/tim-rusci…
    📂 GitHub: https://github.com/techwithtim
    🔊 Podcast: https://anchor.fm/tech-with-tim

    💵 One-Time Donations: https://www.paypal.com/donate/?token=…
    💰 Patreon: https://www.patreon.com/techwithtim
    ◾◾◾◾◾◾

    ⚡ Please leave a LIKE and SUBSCRIBE for more content! ⚡

    Tags:
    – Tech With Tim
    – Python Tutorials
    – Python MySQL
    – MySQL Tutorial Python

    Python MySQL SQL

[Tự học python] Kết nối MySQLdb trong Python

  • Tác giả: cafedev.vn
  • Đánh giá: 3 ⭐ ( 2214 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Trong bài này, chúng ta sẽ tìm hiểu về cách kết nối từ xa tới cơ sở dữ liệu MySQL bằng cách sử dụng Python.

Truy cập MySQL Database trong Python

  • Tác giả: mocnoi.com
  • Đánh giá: 4 ⭐ ( 5489 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Truy cập MySQL Database trong Python

[Python cơ bản thường dùng trong công việc] Phần 9 : Kết nối MySQL

  • Tác giả: topdev.vn
  • Đánh giá: 3 ⭐ ( 1823 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: 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

Cài đặt môi trường MySQL cho Python

  • Tác giả: viettuts.vn
  • Đánh giá: 4 ⭐ ( 2330 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: Python cho phép chúng ta kết nối với các cơ sở dữ liệu như MySQL, SQLite, MongoDB. Bài này chúng ta sẽ tìm hiểu về cài đặt môi trường MySQL cho Python.

Truy cập MySQL Database trong Python

  • Tác giả: kcntt.duytan.edu.vn
  • Đánh giá: 4 ⭐ ( 9896 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: 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…

Truy cập MySQL Database trong Python

  • Tác giả: hoclaptrinh.vn
  • Đánh giá: 5 ⭐ ( 9271 lượt đánh giá )
  • Khớp với kết quả tìm kiếm: 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 …

Xem thêm các bài viết khác thuộc chuyên mục: Kiến thức lập trình