MySQL kết nối lại Python

Trong , bạn đã cài đặt MySQL Connector/Python và đảm bảo rằng mô-đun đã hoạt động. Tuy nhiên, việc in chuỗi phiên bản cho trình kết nối hầu như không thú vị lắm, vì vậy blog này sẽ bắt đầu hành trình khám phá các tính năng của hai API cũ

mysql. mô-đun trình kết nối bao gồm việc triển khai API Cơ sở dữ liệu Python, được xác định trong PEP249. Điều này bao gồm tùy chọn sử dụng Tiện ích mở rộng C trong khi sử dụng cùng một API.  

Bài viết này trình bày chi tiết về cách tạo và định cấu hình kết nối với MySQL. Tạo kết nối rất đơn giản và là điều đầu tiên bạn sẽ học. Tuy nhiên, có một chút kết nối hơn là chỉ tạo ra nó. Phần còn lại của blog sẽ thảo luận về cách định cấu hình kết nối, bao gồm các mẹo để tránh mã hóa cứng tên người dùng và mật khẩu vào ứng dụng. Bài viết kết thúc bằng phần thảo luận về các tùy chọn khác liên quan đến kết nối, đặc biệt tập trung vào bộ ký tự

Tạo kết nối từ Python

Phải mất một số công việc để đi đến điểm này, nhưng bây giờ bạn đã sẵn sàng kết nối với MySQL từ Python lần đầu tiên. Phần này sẽ đi qua cú pháp tạo kết nối, các tùy chọn kết nối phổ biến nhất, ví dụ về tạo kết nối, định cấu hình lại kết nối và một số phương pháp hay nhất cho kết nối

cú pháp

Có một số cách để tạo kết nối. Bốn người trong số họ là

  • Hàm
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    5. Đây là phương thức kết nối linh hoạt nhất. Nó cung cấp một cách thống nhất để tạo kết nối bằng Tiện ích mở rộng C hoặc cho phép kết nối tổng hợp và các tùy chọn liên quan đến chuyển đổi dự phòng. Hàm này hoạt động như một trình bao bọc trả về một đối tượng của lớp thích hợp tùy thuộc vào cài đặt
  • Hàm tạo
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    6
  • Phương pháp
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    7. Trước tiên, nó yêu cầu khởi tạo lớp MySQLConnection mà không có đối số và sau đó tạo kết nối
  • Tương tự như trước khi sử dụng phương thức
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    7, nhưng có sự khác biệt là phương thức
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    9 được gọi một cách rõ ràng để định cấu hình kết nối

Lớp

db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
0 là triển khai Python thuần túy. Ngoài ra, lớp
db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
1 có thể được sử dụng, lớp này cung cấp triển khai phần phụ trợ Tiện ích mở rộng C cho API cơ sở dữ liệu Python

Tất cả các phương thức kết thúc với cùng một đối tượng kết nối và tất cả chúng đều lấy các tùy chọn kết nối làm đối số từ khóa. Điều này có nghĩa là bạn có thể chọn bất kỳ cách nào để tạo kết nối phù hợp nhất với chương trình. Tuy nhiên, vì hàm

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 là mạnh nhất nên đây là cách được ưu tiên để kết nối vì nó giúp dễ dàng chuyển đổi giữa triển khai Python thuần túy và Tiện ích mở rộng C hoặc để bật kết nối tổng hợp hoặc chuyển đổi dự phòng

Mẹo

Tạo kết nối bằng chức năng

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 cấp quyền truy cập vào tất cả các tính năng liên quan đến kết nối

Hình 1 hiển thị quy trình cơ bản của việc sử dụng bốn cách để tạo kết nối. Các hộp màu đỏ [xám đậm] được gọi trực tiếp từ mã ứng dụng và các hộp màu vàng [xám nhạt] được gọi bằng phương thức cuối cùng được gọi là gián tiếp. Hình này sử dụng lớp MySQLConnection;

 

Hình 1 Quy trình tạo kết nối

Tuyến ngoài cùng bên trái là tuyến sử dụng hàm

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5. Chương trình Python gọi hàm với các đối số kết nối và sau đó hàm xử lý phần còn lại. Hình này giả sử một kết nối MySQLConnection [sử dụng triển khai Python thuần túy] được tạo, nhưng hàm cũng có thể trả về một đối tượng CMySQLConnection nếu Tiện ích mở rộng C được sử dụng. Cú pháp cơ bản của hàm
db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 là

db = mysql.connector.connect[**kwargs]

Tuyến đường thứ hai từ bên trái có chương trình Python gửi các đối số kết nối tới hàm tạo khi khởi tạo lớp

db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
0. Điều này kích hoạt hàm tạo gọi phương thức_______5_______7, phương thức này sẽ gọi phương thức config[]. Cú pháp khi sử dụng lớp
db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
0 là

db = mysql.connector.MySQLConnection[**kwargs]

Trong lộ trình thứ ba từ bên trái, lớp

db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
0 được khởi tạo đầu tiên và sau đó phương thức
db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
7 được gọi một cách rõ ràng. Cú pháp mã trở thành

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]

Cuối cùng, trong lộ trình ngoài cùng bên phải, tất cả các bước được thực hiện rõ ràng. Lưu ý rằng thứ tự gọi các phương thức

db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]
7 và
import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
2 trong trường hợp này bị đảo ngược so với ba cách tạo kết nối khác. Cú pháp là

db = mysql.connector.MySQLConnection[]
db.config[**kwargs]
db.connect[]

Trước khi tạo một số kết nối thực, cần xem qua các tùy chọn phổ biến nhất được sử dụng khi tạo kết nối

Tùy chọn kết nối phổ biến

Các tùy chọn được sử dụng phổ biến nhất để chỉ định cách kết nối với MySQL, xác thực ai và sử dụng mật khẩu nào được tóm tắt trong Bảng 1

Bảng 1 Các tùy chọn liên quan đến kết nối phổ biến

Tranh luận

Giá trị mặc định

Sự miêu tả

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
3

127. 0. 0. 1

Tên máy chủ lưu trữ, nơi cài đặt phiên bản MySQL mà bạn muốn kết nối. Mặc định là kết nối với loopback [đó là máy chủ cục bộ]

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
4

3306

Cổng mà MySQL đang lắng nghe. Cổng

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
5 là cổng MySQL tiêu chuẩn

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
6

Trên Linux và Unix, có thể kết nối với phiên bản MySQL trên máy chủ lưu trữ cục bộ bằng cách sử dụng ổ cắm Unix. Chỉ định đường dẫn đến tệp ổ cắm

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
7

Tên người dùng của người dùng ứng dụng. Không bao gồm @ và tên máy chủ sau; . Chỉ cần chỉ định pyuser

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
8

Mật khẩu để xác thực. Đối với người dùng thử nghiệm, đây sẽ là Py@pp4Demo

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
9

Đường dẫn đến tệp chứa cơ quan cấp chứng chỉ SSL [CA]

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
0

Đường dẫn đến tệp chứa chứng chỉ SSL công khai

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
1

Mật mã SSL để sử dụng cho kết nối. Bạn có thể nhận danh sách các mật mã hợp lệ bằng cách kết nối với MySQL bằng SSL và thực hiện truy vấn HIỂN THỊ TÌNH TRẠNG TOÀN CẦU NHƯ ‘Ssl_cipher_list’;

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
3

Buộc kết nối không phải SSL

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
4

Đường dẫn đến tệp chứa khóa SSL riêng

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
5

Sai

Trình kết nối MySQL/Python có nên xác minh chứng chỉ được sử dụng bởi Máy chủ MySQL dựa trên CA được chỉ định với tùy chọn

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
9 hay không

Ví dụ, các tên tùy chọn có vẻ quen thuộc nếu bạn đã sử dụng ứng dụng khách dòng lệnh MySQL. Đó không phải là một sự trùng hợp ngẫu nhiên. Sử dụng các tùy chọn này, có thể trình bày cách tạo kết nối

Mẹo

Có một số chương trình ví dụ trong bài viết này. Tất cả các chương trình ví dụ xuất hiện trong danh sách đều có sẵn để tải xuống. Xem phần thảo luận về các chương trình mẫu trong bài viết này để biết thêm thông tin về cách sử dụng các chương trình mẫu

Ví dụ kết nối

Đã đến lúc kết hợp bốn cách tạo kết nối cũng như tùy chọn kết nối phổ biến nhất để tạo các ví dụ mã nguồn để tạo kết nối MySQL Connector/Python. Liệt kê 1 hiển thị cách kết nối bằng bốn cách tạo kết nối. Các ví dụ theo thứ tự như khi chúng được thảo luận trước đó trong phần

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]

Liệt kê 1 Ví dụ về kết nối với MySQL

Bốn kết nối sử dụng các tùy chọn kết nối giống nhau. Khi kết nối được tạo, ID kết nối [từ phía Máy chủ MySQL] của kết nối được in bằng thuộc tính

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
7 của kết nối. Cuối cùng, kết nối được đóng lại bằng phương pháp
MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16
8. Cách tốt nhất là luôn đóng kết nối một cách rõ ràng khi ứng dụng hoàn tất với nó

Mẹo

Luôn đóng kết nối khi bạn thực hiện xong. Đóng kết nối đảm bảo ngắt kết nối sạch khỏi Máy chủ MySQL. Cũng có thể mất một khoảng thời gian trước khi máy chủ hủy kết nối;

Đầu ra tương tự như mẫu sau ngoại trừ ID kết nối sẽ khác

MySQL connection ID for db1: 13
MySQL connection ID for db2: 14
MySQL connection ID for db3: 15
MySQL connection ID for db4: 16

Phương thức config[] cũng có thể được gọi cho một kết nối hiện có. Hãy thảo luận về cách định cấu hình lại kết nối và kết nối lại tiếp theo

Cấu hình lại và kết nối lại

Điều này thường không được thực hiện, nhưng có thể cấu hình lại kết nối hiện có và kết nối lại. Trong bối cảnh này, cấu hình lại có nghĩa là có khả năng thay đổi tất cả các tùy chọn bao gồm cả phiên bản Máy chủ MySQL mà ứng dụng được kết nối với. Khi những thay đổi như vậy được thực hiện, cần thông báo rõ ràng cho MySQL Connector/Python để kết nối lại

Để định cấu hình lại kết nối, hãy sử dụng phương pháp

import mysql.connector
connect_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# ---- connect[] function ----
db1 = mysql.connector.connect[
  **connect_args
]
print[
  "MySQL connection ID for db1: {0}"
  .format[db1.connection_id]
]
db1.close[]
# ---- Explicit MySQLConnection ----
db2 = mysql.connector.MySQLConnection[
  **connect_args
]
print[
  "MySQL connection ID for db2: {0}"
  .format[db2.connection_id]
]
db2.close[]
# ---- Two steps manually ----
db3 = mysql.connector.MySQLConnection[]
db3.connect[**connect_args]
print[
  "MySQL connection ID for db3: {0}"
  .format[db3.connection_id]
]
db3.close[]
# ---- All three steps manually ----
db4 = mysql.connector.MySQLConnection[]
db4.config[**connect_args]
db4.connect[]
print[
  "MySQL connection ID for db4: {0}"
  .format[db4.connection_id]
]
db4.close[]
2 giống như cách bạn đã làm trước khi thực hiện kết nối ban đầu. Khi cấu hình mới, mong muốn đã được tạo, hãy gọi phương thức
import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
0 nếu bất kỳ thay đổi cấu hình nào yêu cầu kết nối mới. Gọi
import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
0 sẽ đóng kết nối cũ và tạo một kết nối mới với cấu hình mới. Liệt kê 2 hiển thị một ví dụ về cấu hình lại kết nối

import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]

Liệt kê 2 Cấu hình lại một kết nối

Ví dụ này yêu cầu phải có tài khoản người dùng thứ hai trên cùng một phiên bản MySQL. Người dùng giống với kết nối

import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
2 hiện có, nhưng được xác định để kết nối từ địa chỉ IP công cộng [thay thế bằng địa chỉ IP của máy tính của bạn hoặc nếu địa chỉ IP phân giải bằng tên máy chủ]

mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]

Điều cần thiết là bất kỳ tường lửa nào cũng cho phép kết nối

Như bạn có thể thấy từ ví dụ, không cần thiết phải thay đổi tất cả các tùy chọn cấu hình. Những cái không được đặt rõ ràng trong bộ tùy chọn mới sẽ giữ nguyên giá trị cũ của chúng. Đầu ra của chương trình là [ngoại trừ ID]

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22

Chủ đề cuối cùng của phần này là một số phương pháp hay nhất về kết nối

Thực tiễn tốt nhất về kết nối

Có một vài thực tiễn tốt nhất nên tuân theo khi nói đến kết nối. Luôn khó khăn với các phương pháp hay nhất vì tất cả các ứng dụng đều có các yêu cầu riêng. Vì vậy, các đề xuất sẽ tập trung vào khía cạnh kỹ thuật của MySQL Connector/Python

Các thực hành tốt nhất chính là

  • Luôn đóng kết nối khi bạn thực hiện xong. Điều này đã được thảo luận
  • Sử dụng SSL [TLS] để mã hóa các kết nối. Điều này đặc biệt quan trọng nếu bạn đang kết nối với một máy chủ từ xa và thậm chí còn quan trọng hơn nếu kết nối qua một mạng không an toàn. Một ngoại lệ là khi bạn sử dụng ổ cắm Unix cho kết nối vì đó luôn được coi là kết nối an toàn ngay cả khi không sử dụng SSL
  • Không mã hóa cứng cấu hình vào mã nguồn. Điều này đặc biệt áp dụng cho mật khẩu

Ghi chú

Mặc dù MySQL sử dụng ssl_ làm tiền tố cho các tùy chọn liên quan đến mã hóa kết nối, nhưng trên thực tế, TLS được sử dụng

Trong Mysql 8. 0 và trong một số bản dựng của MySQL 5. 7, SSL được bật theo mặc định bằng chứng chỉ tự ký và MySQL Connector/Python sẽ sử dụng kết nối được mã hóa theo mặc định

Các ví dụ cho đến nay đã có một lỗ hổng lớn. họ đã mã hóa cứng không chỉ nơi kết nối mà còn cả tên người dùng và đặc biệt là mật khẩu. Điều này làm cho mã khó bảo trì hơn và nó cũng là một mối lo ngại về bảo mật vì mật khẩu hiển thị cho bất kỳ ai có quyền truy cập vào mã nguồn. Mã hóa cứng các tùy chọn kết nối cũng có nghĩa là hệ thống phát triển và sản xuất phải chia sẻ các tùy chọn kết nối hoặc quy trình triển khai cần thay đổi mã nguồn để cập nhật các tham số cấu hình

thận trọng

Không bao giờ lưu trữ mật khẩu trong mã nguồn

Không phải là một lựa chọn tốt, vì vậy phải tìm một giải pháp thay thế. Phần tiếp theo sẽ thảo luận về một giải pháp thay thế. sử dụng tập tin cấu hình

Tệp cấu hình

Phương pháp chỉ định các tùy chọn kết nối trực tiếp với lệnh gọi để tạo kết nối tới MySQL có thể rất hữu ích để thực hiện các kiểm tra nhanh, nhưng nó không thực tế và cũng không an toàn [đối với mật khẩu] để thực hiện trong các ứng dụng thực. Phần này sẽ bắt đầu thảo luận về một số lựa chọn thay thế và sau đó sẽ đi vào chi tiết cách sử dụng các tệp cấu hình MySQL

Các lựa chọn thay thế để mã hóa cấu hình

Có một số cách để tránh mã hóa cứng cấu hình kết nối vào mã nguồn. Có những ưu và nhược điểm đối với mỗi phương pháp, vì vậy không phải là vấn đề một kích thước phù hợp với tất cả. Bốn phương pháp sẽ được thảo luận

  • Yêu cầu thông tin một cách tương tác
  • Sử dụng biến môi trường
  • Đọc thông tin từ tệp cấu hình riêng của ứng dụng hoặc dưới dạng đối số dòng lệnh
  • Sử dụng tệp cấu hình MySQL

Cách tiếp cận tương tác là tuyệt vời nếu bạn đang viết một chương trình có thể được sử dụng bởi những người dùng khác nhau, vì vậy không biết chương trình sẽ kết nối với ai. Đó cũng là cách an toàn nhất để truyền mật khẩu cho chương trình. Tuy nhiên, sẽ không thuận tiện lắm đối với các quy trình giống daemon hơn khi yêu cầu bắt đầu quy trình theo cách thủ công mỗi khi cần khởi động lại nó

Các biến môi trường có thể được sử dụng để chỉ định các tùy chọn cho phiên. Các tiến trình con sẽ kế thừa môi trường của tiến trình cha, do đó, các biến môi trường có thể được sử dụng để chuyển cài đặt cho một tiến trình con, chẳng hạn như từ shell đến ứng dụng. Đây có thể là một cách tuyệt vời để định cấu hình ứng dụng mà không yêu cầu tệp hoặc phân tích cú pháp các tùy chọn trên dòng lệnh. Ví dụ: đây là cách phổ biến để định cấu hình các ứng dụng chạy bên trong các vùng chứa như Docker

Có một số nhược điểm khi sử dụng các biến môi trường. Khi tự động bắt đầu các quy trình, sẽ cần phải lưu trữ các biến môi trường trong một tệp, điều đó có nghĩa là nó sẽ trở thành một định dạng thay thế cho tệp cấu hình. Môi trường nói chung cũng tồn tại lâu dài; . Người dùng có đặc quyền cao cũng có thể đọc được các biến môi trường. Vì vậy, cần cẩn thận khi sử dụng các biến môi trường

Sử dụng tệp cấu hình riêng của ứng dụng hoặc cung cấp các tùy chọn làm đối số dòng lệnh có nghĩa là tất cả cấu hình được thực hiện ở một nơi. Trong trường hợp này, các tùy chọn MySQL được xử lý giống như các tùy chọn khác và tất cả những gì được yêu cầu khi viết mã là chuyển các tùy chọn và giá trị của chúng cho kết nối MySQL

thận trọng

Hãy thật cẩn thận với mật khẩu dưới dạng tùy chọn dòng lệnh. Những người dùng khác trên máy chủ có thể xem các đối số được truyền cho chương trình, chẳng hạn như bằng cách sử dụng lệnh ps trên Linux. Vì vậy, không nên chỉ định mật khẩu làm đối số dòng lệnh

Có một cách khác, tuy nhiên. Trình kết nối MySQL/Python có hỗ trợ riêng để đọc các tệp cấu hình MySQL. Một số lý do để sử dụng phương pháp này đối với tệp cấu hình riêng của ứng dụng là ứng dụng có thể không cần tệp cấu hình ngoại trừ các tùy chọn liên quan đến MySQL hoặc có thể có các chủ sở hữu cấu hình ứng dụng và cấu hình MySQL khác nhau. Điều thứ hai có thể xảy ra nếu nhà phát triển chịu trách nhiệm xác định hành vi của chính ứng dụng nhưng quản trị viên cơ sở dữ liệu chịu trách nhiệm về các tùy chọn dành riêng cho MySQL

Vì blog này nói về việc sử dụng các tính năng của Trình kết nối MySQL/Python thay vì lập trình Python chung, nên một trong bốn tùy chọn sẽ được thảo luận chi tiết hơn là tùy chọn sử dụng tệp cấu hình MySQL

Sử dụng tệp cấu hình MySQL

MySQL sử dụng định dạng tệp INI cho các tệp cấu hình của nó. Sau đây là một ví dụ đơn giản để sử dụng với MySQL Connector/Python sử dụng cùng cấu hình như trước đó trong bài viết này

[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo

Có hai tùy chọn kết nối kiểm soát việc sử dụng các tệp cấu hình MySQL

  • import mysql.connector
    initial_args = {
      "host": "127.0.0.1",
      "port": 3306,
      "user": "pyuser",
      "password": "Py@pp4Demo",
    };
    # Create initial connection
    db = mysql.connector.connect[
      **initial_args
    ]
    print[
      "Initial MySQL connection ID ...: {0}"
      .format[db.connection_id]
    ]
    new_args = {
      "host": "",
    };
    db.config[**new_args]
    db.reconnect[]
    print[
      "New MySQL connection ID .......: {0}"
      .format[db.connection_id]
    ]
    db.close[]
    3. Tùy chọn này chỉ định đường dẫn đến một hoặc nhiều tệp cấu hình để đọc. Giá trị có thể là một chuỗi hoặc một danh sách các chuỗi. Không có giá trị mặc định
  • import mysql.connector
    initial_args = {
      "host": "127.0.0.1",
      "port": 3306,
      "user": "pyuser",
      "password": "Py@pp4Demo",
    };
    # Create initial connection
    db = mysql.connector.connect[
      **initial_args
    ]
    print[
      "Initial MySQL connection ID ...: {0}"
      .format[db.connection_id]
    ]
    new_args = {
      "host": "",
    };
    db.config[**new_args]
    db.reconnect[]
    print[
      "New MySQL connection ID .......: {0}"
      .format[db.connection_id]
    ]
    db.close[]
    4. Tùy chọn này chỉ định nhóm tùy chọn nào sẽ đọc từ. Nhóm tùy chọn được chỉ định dưới dạng tên giữa các dấu ngoặc vuông; . Giá trị là một danh sách các chuỗi có tên của nhóm. Mặc định là đọc từ máy khách và nhóm
    import mysql.connector
    initial_args = {
      "host": "127.0.0.1",
      "port": 3306,
      "user": "pyuser",
      "password": "Py@pp4Demo",
    };
    # Create initial connection
    db = mysql.connector.connect[
      **initial_args
    ]
    print[
      "Initial MySQL connection ID ...: {0}"
      .format[db.connection_id]
    ]
    new_args = {
      "host": "",
    };
    db.config[**new_args]
    db.reconnect[]
    print[
      "New MySQL connection ID .......: {0}"
      .format[db.connection_id]
    ]
    db.close[]
    5

Theo quy ước, các tệp cấu hình MySQL được gọi là

import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
7 trên Microsoft Windows và
import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
8 trên các nền tảng khác. Không có yêu cầu đối với tên tệp hoặc phần mở rộng tệp theo quan điểm chức năng

Một đặc điểm quan trọng cần lưu ý là tùy chọn

import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
4 không đối xử bình đẳng với tất cả các nhóm. Cụ thể, nhóm
import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
5 đặc biệt vì tất cả các tùy chọn trong nhóm này phải hợp lệ nếu không một ngoại lệ
mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
1 sẽ được đưa ra. Đối với các nhóm khác, các tùy chọn không xác định sẽ bị bỏ qua. Lý do để bỏ qua các tùy chọn không xác định là một số chương trình có thể đọc các nhóm tùy chọn giống nhau. Ví dụ: nhóm máy khách cũng được đọc bởi máy khách dòng lệnh mysql và các chương trình máy khách MySQL khác

Liệt kê 3 hiển thị một ví dụ về kết nối với MySQL bằng các tùy chọn kết nối được đọc từ tệp my. ini nằm trong cùng thư mục với chương trình

db = mysql.connector.MySQLConnection[**kwargs]
0

Liệt kê 3 Sử dụng tệp cấu hình MySQL

Đầu ra tương tự như các ví dụ trước in ID cho kết nối, ví dụ

db = mysql.connector.MySQLConnection[**kwargs]
1

Trong một số trường hợp, bạn có thể muốn chia cấu hình MySQL thành nhiều tệp. Ví dụ: giả sử một số ứng dụng cần kết nối với cùng một phụ trợ MySQL, vì vậy chúng chia sẻ thông tin máy chủ và cổng, nhưng mỗi ứng dụng sử dụng thông tin đăng nhập khác nhau cho kết nối. Tiếp tục ví dụ, có thể tạo 2 file

mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
2 và
mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
3 với nội dung như sau

db = mysql.connector.MySQLConnection[**kwargs]
2

Thay đổi duy nhất được yêu cầu đối với chương trình thử nghiệm là thay đổi giá trị của

mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
4 thành một danh sách. Để chứng minh cách thiết lập tùy chọn
import mysql.connector
initial_args = {
  "host": "127.0.0.1",
  "port": 3306,
  "user": "pyuser",
  "password": "Py@pp4Demo",
};
# Create initial connection
db = mysql.connector.connect[
  **initial_args
]
print[
  "Initial MySQL connection ID ...: {0}"
  .format[db.connection_id]
]
new_args = {
  "host": "",
};
db.config[**new_args]
db.reconnect[]
print[
  "New MySQL connection ID .......: {0}"
  .format[db.connection_id]
]
db.close[]
4, nó cũng được thêm vào chương trình. Mã nguồn kết quả có thể được nhìn thấy trong Liệt kê 4

db = mysql.connector.MySQLConnection[**kwargs]
3

Liệt kê 4 Sử dụng Nhiều Tệp Cấu hình

Đầu ra là [ngoại trừ ID, sẽ thay đổi từ lần thực thi này sang lần thực hiện khác] như sau

db = mysql.connector.MySQLConnection[**kwargs]
4

Một xem xét cuối cùng là tên đường dẫn. Nếu một đường dẫn tương đối được chỉ định, thì đó là thư mục nơi Python được thực thi được sử dụng làm thư mục cơ sở. Lấy ví dụ, lệnh sau để thực thi một chương trình [ID nói chung sẽ khác]

db = mysql.connector.MySQLConnection[**kwargs]
5

của anh ấy được thực thi trong khi

mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
6 là thư mục làm việc hiện tại. nếu kiểm tra. py có
mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
7, thì my. ini phải được đặt trong
mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
6

Một quan sát khác là đối với Microsoft Windows, việc sử dụng dấu gạch chéo ngược [

mysql> CREATE USER pyuser@''
                   IDENTIFIED BY 'Py@pp4Demo';
Query OK, 0 rows affected [0.84 sec]
9] hoặc dấu gạch chéo xuôi [
Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
0] để phân tách các thành phần đường dẫn [thư mục] là tùy chọn.

Điều này kết thúc cuộc thảo luận về các tập tin cấu hình. Chủ đề cuối cùng của bài viết là các tùy chọn còn lại mà MySQL Connector/Python hỗ trợ cho kết nối

Cấu hình chung

Cho đến nay, các tùy chọn cấu hình duy nhất đã được thảo luận là những tùy chọn cần thiết để chỉ định nơi kết nối, kết nối với ai và có sử dụng SSL hay không. Có một số tùy chọn khác liên quan nhiều hơn đến hành vi của ứng dụng. Các tùy chọn này là chủ đề của phần này

Các tùy chọn không có trong danh sách các tùy chọn kết nối trước đó trong blog được tóm tắt trong Bảng 2 đến Bảng 5 với một bảng cho từng loại tùy chọn sau. kết nối, bộ ký tự, hành vi truy vấn và cảnh báo

Sự liên quan

Có nhiều tùy chọn kết nối hơn đã được thảo luận trong phần “”. Chúng không được sử dụng phổ biến nhưng có thể được yêu cầu cho một số trường hợp sử dụng. Các tùy chọn được tóm tắt trong Bảng 2. Một số tùy chọn sẽ được thảo luận chi tiết hơn sau bảng

Bảng 2 Các tùy chọn liên quan đến kết nối ít phổ biến hơn

Tên

Giá trị mặc định

Sự miêu tả

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
1

Nên sử dụng plugin xác thực nào. Ví dụ, đây là yêu cầu khi sử dụng MySQL Connector/Python 2. 1 để kết nối với MySQL Server 8. 0 vì plugin xác thực mặc định của máy chủ không được hỗ trợ bởi các phiên bản MySQL Connector/Python cũ

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
2

Một cách khác để định cấu hình một số tùy chọn thông qua cờ

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
3

Sai

Khi được bật, lưu lượng mạng được nén

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
4

Phải đợi bao lâu trước khi hết thời gian khi tạo kết nối

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
5

Chỉ định một lớp trình chuyển đổi tùy chỉnh để chuyển đổi dữ liệu hàng thô thành các loại Python

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
6

Bộ từ điển chỉ định các phiên bản Máy chủ MySQL thay thế chuyển sang không thành công nếu kết nối chính không thành công. Điều này chỉ được hỗ trợ khi sử dụng chức năng

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
8

Sai

Khi True, IPv6 luôn được sử dụng khi có thể

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
9

Tự động tạo ra

Tên của nhóm kết nối. Theo mặc định, tên được tạo bằng cách nối các giá trị của tùy chọn kết nối máy chủ, cổng, người dùng và cơ sở dữ liệu. Tên có thể dài tối đa

[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
0 [mặc định là 64] ký tự và được phép sử dụng các ký tự chữ và số cũng như các ký tự sau.
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
1,
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
2,
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
3,
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
4,
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
5,
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
6 và
[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
7. Điều này chỉ được hỗ trợ bằng cách sử dụng hàm
db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 hoặc bằng cách khởi tạo tổng hợp. Lớp xây dựng MySQLConnectionPool trực tiếp

[connector_python]
user     = pyuser
host     = 127.0.0.1
port     = 3306
password = Py@pp4Demo
9

Thật

Khi True, các biến phiên được đặt lại khi kết nối được trả về nhóm. Điều này chỉ được hỗ trợ bằng cách sử dụng hàm

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 hoặc bằng cách khởi tạo tổng hợp. Lớp xây dựng MySQLConnectionPool trực tiếp

db = mysql.connector.MySQLConnection[**kwargs]
01

5

Số lượng kết nối để giữ trong nhóm. Giá trị ít nhất phải là 1 và nhiều nhất là

db = mysql.connector.MySQLConnection[**kwargs]
02 [mặc định là 32]. Điều này chỉ được hỗ trợ bằng cách sử dụng hàm
db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
5 hoặc bằng cách khởi tạo tổng hợp. Lớp xây dựng MySQLConnectionPool trực tiếp

db = mysql.connector.MySQLConnection[**kwargs]
04

Sai

Khi True, việc triển khai Python thuần túy của trình kết nối được sử dụng. Khi Sai, Tiện ích mở rộng C được sử dụng. Nếu tùy chọn không được chỉ định, mặc định là sử dụng Tiện ích mở rộng C nếu nó được cài đặt; . Điều này chỉ được hỗ trợ bằng cách sử dụng mysql. tư nối. chức năng kết nối []. Trong hầu hết các trường hợp, nên sử dụng Tiện ích mở rộng C

Tùy chọn

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
3 có thể được sử dụng để giảm lưu lượng mạng bằng cách nén dữ liệu được truyền giữa ứng dụng và Máy chủ MySQL [và ngược lại] với chi phí tài nguyên tính toán bổ sung. Điều này có thể đặc biệt hữu ích nếu các câu lệnh SQL lớn được gửi đến máy chủ hoặc các kết quả truy vấn lớn được trả về ứng dụng và ứng dụng được cài đặt trên máy chủ từ xa

Bốn tùy chọn đáng được chú ý hơn một chút là các tùy chọn

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
6 và
db = mysql.connector.MySQLConnection[**kwargs]
07. Tùy chọn
Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
6 có thể được sử dụng để xác định một hoặc nhiều phiên bản Máy chủ MySQL mà Trình kết nối MySQL/Python sẽ không thành công nếu kết nối với phiên bản chính không thành công. Mỗi phiên bản Máy chủ MySQL thay thế được chỉ định làm từ điển trong bộ hoặc danh sách. Các tùy chọn
db = mysql.connector.MySQLConnection[**kwargs]
07 thiết lập nhóm kết nối mà ứng dụng có thể yêu cầu kết nối từ

Tùy chọn

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
2 có thể được sử dụng để đặt một số tùy chọn. Danh sách các tùy chọn có sẵn có thể được xác định bằng cách sử dụng phương pháp
db = mysql.connector.MySQLConnection[**kwargs]
11 của hằng số
db = mysql.connector.MySQLConnection[**kwargs]
12

db = mysql.connector.MySQLConnection[**kwargs]
6

Đầu ra từ Trình kết nối/Python 8. 0. 11 có thể được nhìn thấy trong Liệt kê 5. Tên của cờ khách hàng được liệt kê đầu tiên, tiếp theo là mô tả về những gì cờ kiểm soát. Hầu hết các cờ cũng có các tùy chọn dành riêng, nhưng có một số cờ bổ sung như

db = mysql.connector.MySQLConnection[**kwargs]
13 chỉ có thể được đặt thông qua
db = mysql.connector.MySQLConnection[**kwargs]
14

db = mysql.connector.MySQLConnection[**kwargs]
7

Liệt kê 5 Danh sách các cờ khách hàng

Để định cấu hình

Initial MySQL connection ID ...: 21
New MySQL connection ID .......: 22
2, hãy chỉ định danh sách các cờ sẽ được bật hoặc tắt. Để bật cờ, chỉ cần chỉ định tên của cờ; . Liệt kê 6 hiển thị một ví dụ để cho biết kết nối đó là một kết nối tương tác, nhưng nó không thể xử lý các mật khẩu đã hết hạn

db = mysql.connector.MySQLConnection[**kwargs]
8

Liệt kê 6 Sử dụng cờ máy khách trong kết nối

Điều này cho kết quả sau [một lần nữa ngoại trừ các giá trị của ID]

db = mysql.connector.MySQLConnection[**kwargs]
9

Tùy chọn use_pure có thể được sử dụng để chỉ định liệu Tiện ích mở rộng C hay triển khai Python thuần túy của trình kết nối sẽ được sử dụng. Tiện ích mở rộng C cung cấp hiệu suất tốt hơn so với triển khai thuần túy, đặc biệt khi làm việc với các tập kết quả lớn và các câu lệnh đã chuẩn bị. Mặt khác, việc triển khai Python thuần túy được hỗ trợ trên nhiều nền tảng hơn, có thêm một vài tính năng và dễ dàng sửa đổi mã nguồn hơn. Tiện ích mở rộng C là mặc định trong phiên bản 8. 0. 11 trở lên khi nó được cài đặt, trong khi các phiên bản trước đó sử dụng triển khai Python thuần túy theo mặc định

Tiện ích mở rộng C cũng có thể được sử dụng bằng cách nhập mô-đun_______15_______16 thay vì mô-đun

db = mysql.connector.MySQLConnection[**kwargs]
17 thông thường

Các tùy chọn kết nối khác sẽ không được thảo luận chi tiết hơn. Thay vào đó, tiêu điểm sẽ được chuyển đến các tùy chọn bộ ký tự

Bộ ký tự

Bộ ký tự xác định cách các ký tự được mã hóa. Trong những ngày đầu của Internet, bộ ký tự ASCII thường được sử dụng. ASCII sử dụng bảy bit cho mỗi ký tự, tiết kiệm không gian hiệu quả nhưng điều đó có nghĩa là chỉ có 128 ký tự khác nhau khả dụng. Điều này hoạt động khá tốt đối với văn bản thuần túy bằng tiếng Anh, nhưng nó thiếu ký tự đối với các ngôn ngữ khác. Trong những năm qua, nhiều bộ ký tự khác đã được sử dụng, chẳng hạn như bộ ký tự Latinh

Các bộ ký tự dành riêng cho ngôn ngữ giúp hỗ trợ tất cả các ngôn ngữ, nhưng có nhược điểm là cần có các mã hóa khác nhau cho các ngôn ngữ khác nhau. Một phản hồi cho điều đó là mã hóa Định dạng Chuyển đổi Unicode [UTF]; . UTF-8 sử dụng một số byte thay đổi để lưu trữ các ký tự. 128 ký tự ASCII ban đầu có cùng mã hóa trong UTF-8;

Cho đến khi và bao gồm MySQL Server 5. 7, bộ ký tự mặc định cho phía máy chủ là Latin1, nhưng điều này đã thay đổi trong MySQL 8. 0 khi

db = mysql.connector.MySQLConnection[**kwargs]
18 trở thành mặc định. Hậu tố mb4 chỉ ra rằng tối đa bốn byte được sử dụng cho mỗi ký tự [mb = nhiều byte]. Lý do điều này là bắt buộc vì utf8 trong MySQL trước đây có nghĩa là mỗi ký tự được hỗ trợ tối đa ba byte cho mỗi ký tự. Tuy nhiên, việc triển khai UTF-8 ba byte bỏ lỡ một số biểu tượng cảm xúc và nó không được dùng nữa, vì vậy tốt hơn là sử dụng biến thể bốn byte. Bộ ký tự mặc định cho Trình kết nối/Python cho đến phiên bản 8. 0. 12 là utf8, đây là triển khai ba byte của UTF-8 [được gọi là
db = mysql.connector.MySQLConnection[**kwargs]
19 hoặc
db = mysql.connector.MySQLConnection[**kwargs]
20 trong Máy chủ MySQL]. Bắt đầu từ phiên bản 8. 0. 12 mặc định là utf8mb4 như trong MySQL Server

Ngoài ra còn có khái niệm đối chiếu để xem xét. Đối chiếu xác định cách so sánh hai ký tự hoặc chuỗi ký tự với nhau, chẳng hạn như liệu ä và a có được coi là cùng một ký tự khi so sánh hay không và liệu ss có được coi là ngang bằng với ß [s sắc nét trong tiếng Đức]. Đối chiếu cũng xác định thứ tự sắp xếp của các ký tự và liệu so sánh có phân biệt chữ hoa chữ thường hay không. Mỗi bộ ký tự có một đối chiếu mặc định, nhưng cũng có thể yêu cầu đối chiếu một cách rõ ràng

Mẹo

Trừ khi bạn có các yêu cầu cụ thể của quốc gia, đối chiếu mặc định trong Máy chủ MySQL thường là một lựa chọn tốt khi chọn

db = mysql.connector.MySQLConnection[**kwargs]
19 hoặc
db = mysql.connector.MySQLConnection[**kwargs]
18 làm bộ ký tự

Nhìn chung, các bộ ký tự và đối chiếu có sẵn trong MySQL không thay đổi nhiều giữa các phiên bản. Tuy nhiên, một trong những thay đổi lớn đối với MySQL Server 8. 0 là sự bổ sung của một loạt UCA 9. 0. 0 bộ sưu tập. Thông tin về các bộ ký tự có sẵn và đối chiếu mặc định của chúng có thể được tìm thấy bằng cách sử dụng bảng

db = mysql.connector.MySQLConnection[**kwargs]
23 trong Lược đồ thông tin, như trong Liệt kê 7

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
0

Liệt kê 7 Bộ sưu tập bộ ký tự trong MySQL 8. 0. 11

Tương tự, các bộ sưu tập có sẵn cho một bộ ký tự cụ thể có thể được xác định bằng cách sử dụng bảng COLLATIONS. Danh sách hiển thị đầu ra cho bộ ký tự

db = mysql.connector.MySQLConnection[**kwargs]
18

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
1

Liệt kê 8 Các bộ sưu tập có sẵn cho Bộ ký tự utf8mb4

Đầu ra hiển thị 73 đối chiếu có sẵn cho utf8mb4 trong MySQL Server 8. 0. 11. Tên đối chiếu bao gồm một số phần

  • Tên bộ ký tự
  • Đối chiếu dành cho quốc gia nào [ví dụ: ja cho Nhật Bản] hoặc liệu nó có tính chất tổng quát hơn hay không
  • Công cụ sửa đổi [dấu trọng âm]. Đây không phải là hiện diện cho tất cả các bộ sưu tập. Ví dụ là
    db = mysql.connector.MySQLConnection[**kwargs]
    25 đối với không phân biệt dấu, như đối với phân biệt dấu,
    db = mysql.connector.MySQLConnection[**kwargs]
    26 đối với phân biệt chữ hoa chữ thường và
    db = mysql.connector.MySQLConnection[**kwargs]
    27 đối với phân biệt chữ hoa chữ thường

Mẹo

Chủ đề về bộ ký tự và đối chiếu trong MySQL rất lớn. Để thảo luận sâu hơn, hãy xem https. // nhà phát triển. mysql. com/doc/refman/vi/bộ ký tự. html và tài liệu tham khảo trong đó

Có ba tùy chọn liên quan đến bộ ký tự và đối chiếu cho MySQL Connector/Python. Chúng được tóm tắt trong Bảng

Bảng 3 Tùy chọn liên quan đến bộ ký tự

Tên

Giá trị mặc định

Sự miêu tả

db = mysql.connector.MySQLConnection[**kwargs]
28

utf8mb4

Bộ ký tự được sử dụng cho kết nối. Trong Trình kết nối MySQL/Python 8. 0. 11 trở về trước, mặc định là utf8. Trong hầu hết các trường hợp, nên sử dụng

db = mysql.connector.MySQLConnection[**kwargs]
18

db = mysql.connector.MySQLConnection[**kwargs]
30

utf8mb4_General_ci

Đối chiếu để sử dụng để so sánh và sắp xếp các chuỗi. Trong nhiều trường hợp, mặc định có thể được sử dụng. Giá trị mặc định cho Trình kết nối MySQL/Python 8. 0. 11 trở về trước là

db = mysql.connector.MySQLConnection[**kwargs]
31. Trong máy chủ MySQL 8. 0, đối chiếu mặc định cho bộ ký tự utf8mb4 là
db = mysql.connector.MySQLConnection[**kwargs]
32 thường là một lựa chọn tốt trừ khi có các yêu cầu cụ thể

db = mysql.connector.MySQLConnection[**kwargs]
33

Thật

Có trả về chuỗi trong kết quả truy vấn dưới dạng chữ Python Unicode hay không. Giá trị mặc định là True và đây cũng thường là giá trị tốt nhất để sử dụng

Liệt kê 9 cho thấy một ví dụ về cấu hình các tùy chọn của ký tự

db = mysql.connector.MySQLConnection[**kwargs]
34

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
2

Có thể thay đổi bộ ký tự và đối chiếu được sử dụng bởi kết nối sau khi kết nối ban đầu với Máy chủ MySQL được thực hiện. Cách tốt nhất để làm điều này là thay đổi các thuộc tính bộ ký tự và đối chiếu của kết nối bằng cách sử dụng phương thức

db = mysql.connector.MySQLConnection[**kwargs]
35 như minh họa trong Liệt kê 10. Lưu ý rằng không giống như các ví dụ còn lại, ví dụ này trước tiên khởi tạo lớp MySQLConnection để có thể in bộ ký tự ban đầu và đối chiếu trước khi tạo kết nối

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
3

Liệt kê 10 Thay đổi bộ ký tự của kết nối

Như bạn có thể thấy từ ví dụ, các thuộc tính đối chiếu và bộ ký tự có thể được sử dụng ngay cả trước khi kết nối được thiết lập. Tuy nhiên, không thể sử dụng phương pháp

db = mysql.connector.MySQLConnection[**kwargs]
35 để thay đổi bộ ký tự hoặc đối chiếu cho đến khi kết nối được thiết lập

Ghi chú

Luôn sử dụng phương pháp

db = mysql.connector.MySQLConnection[**kwargs]
35 để thay đổi bộ ký tự và/hoặc đối chiếu cho kết nối. So với việc thực thi trực tiếp
db = mysql.connector.MySQLConnection[**kwargs]
38 dưới dạng câu lệnh SQL, nó đảm bảo rằng Trình kết nối/Python biết cài đặt nào được sử dụng để chuyển đổi mảng phụ thành chuỗi Python, bộ ký tự và lựa chọn đối chiếu được xác thực đối với những cài đặt được biết bởi Trình kết nối/Python và cài đặt Tiện ích mở rộng C là

Việc thiết lập kết nối sẽ không thay đổi giá trị của các thuộc tính bộ ký tự và đối chiếu. Bộ ký tự có thể tự thay đổi, trong trường hợp đó, đối chiếu được đặt thành mặc định cho bộ ký tự. Trong trường hợp này, bộ ký tự được đặt thành

db = mysql.connector.MySQLConnection[**kwargs]
18, vì vậy bộ ký tự mặc định là
db = mysql.connector.MySQLConnection[**kwargs]
40

Đối chiếu cũng có thể được đặt riêng và cuối cùng cả bộ ký tự và đối chiếu đều được đặt. Đầu ra của việc thực thi chương trình trong Liệt kê 10 bằng phiên bản 8. 0. 11 là

db = mysql.connector.MySQLConnection[]
db.connect[**kwargs]
4

Nếu bạn đang sử dụng Trình kết nối MySQL/Python 8. 0. 12 trở lên, bộ ký tự và đối chiếu cho Ban đầu và Kết nối là

db = mysql.connector.MySQLConnection[**kwargs]
18 và
db = mysql.connector.MySQLConnection[**kwargs]
40

Hành vi truy vấn

Có một số tùy chọn kiểm soát cách hoạt động của các truy vấn. Các phạm vi này từ việc xác định liệu các tính năng có được phép đối với cấu hình giao dịch hay không để xác định cách Trình kết nối MySQL/Python sẽ xử lý kết quả. Các tùy chọn được liệt kê trong Bảng 4

Bảng 4 Tùy chọn liên quan đến truy vấn

Tên

Giá trị mặc định

Sự miêu tả

db = mysql.connector.MySQLConnection[**kwargs]
43

Thật

Câu lệnh LOAD DATA LOCAL INFILE có được phép hay không

db = mysql.connector.MySQLConnection[**kwargs]
44

Sai

Khi True, một COMMIT ẩn được thực thi sau mỗi truy vấn

db = mysql.connector.MySQLConnection[**kwargs]
45

Sai

Khi True, tập hợp kết quả được tìm nạp ngay lập tức và được lưu vào bộ đệm trong ứng dụng

db = mysql.connector.MySQLConnection[**kwargs]
46

Sai

Khi True, kết quả truy vấn được tìm nạp tự động nếu có hàng chưa được tìm nạp và một truy vấn mới được thực thi

db = mysql.connector.MySQLConnection[**kwargs]
47

Cơ sở dữ liệu [lược đồ] nào sẽ được sử dụng làm mặc định cho các truy vấn trong đó tên cơ sở dữ liệu không được cung cấp rõ ràng cho một bảng

db = mysql.connector.MySQLConnection[**kwargs]
48

Sai

Theo mặc định, các giá trị kết quả được chuyển đổi thành các loại Python khi con trỏ được sử dụng. Khi đặt tùy chọn này thành True, kết quả được trả về mà không cần chuyển đổi

db = mysql.connector.MySQLConnection[**kwargs]
49

[Máy chủ mặc định]

Chế độ SQL được sử dụng khi thực hiện truy vấn. Xem https. // nhà phát triển. mysql. com/doc/refman/en/sql-mode. html

db = mysql.connector.MySQLConnection[**kwargs]
50

Khi được đặt, dấu thời gian được chuyển đổi thành múi giờ đó thay vì sử dụng múi giờ phía máy chủ

cảnh báo

Điều rất quan trọng là các cảnh báo và lỗi được xử lý đúng cách. Không làm như vậy có thể dẫn đến dữ liệu bị hỏng hoặc bị mất. Có hai tùy chọn kiểm soát cách Trình kết nối MySQL/Python xử lý cảnh báo khi bạn sử dụng con trỏ. Các tùy chọn được thể hiện trong Bảng 5

Bảng 5 Các tùy chọn liên quan đến cảnh báo dành cho con trỏ

Tên

Giá trị mặc định

Sự miêu tả

db = mysql.connector.MySQLConnection[**kwargs]
51

Sai

Khi được đặt thành True, các cảnh báo sẽ tự động được tìm nạp sau mỗi truy vấn

db = mysql.connector.MySQLConnection[**kwargs]
52

Sai

Khi được đặt thành True, các cảnh báo sẽ tạo ra một ngoại lệ

Tóm lược

Bài viết này hướng dẫn cách tạo và định cấu hình kết nối từ chương trình Python đến cơ sở dữ liệu Máy chủ MySQL. Các chủ đề sau đây đã được thảo luận

  • Bốn cách khác nhau để thiết lập kết nối bao gồm cấu hình ban đầu. Hàm
    db = mysql.connector.MySQLConnection[]
    db.connect[**kwargs]
    5 là phương thức linh hoạt nhất trong bốn phương thức
  • Các tùy chọn cấu hình
  • Thực hành tốt nhất cho các kết nối. Đóng kết nối, sử dụng SSL/TLS để mã hóa lưu lượng, không mã hóa tùy chọn kết nối [đặc biệt là mật khẩu] trong mã nguồn
  • Tệp cấu hình MySQL
  • Bộ nhân vật

Việc có thể tạo kết nối tới cơ sở dữ liệu là hoàn toàn tốt, nhưng nó không hữu ích lắm trừ khi bạn có thể thực hiện các truy vấn

Làm cách nào để kết nối Trình kết nối MySQL trong Python?

Để tạo kết nối giữa cơ sở dữ liệu MySQL và Python, phương thức connect[] của mysql. mô-đun trình kết nối được sử dụng . Chúng tôi chuyển các chi tiết cơ sở dữ liệu như Tên máy chủ, tên người dùng và mật khẩu trong lệnh gọi phương thức, sau đó phương thức trả về đối tượng kết nối.

Làm cách nào để kiểm tra kết nối MySQL trong Python?

Cách kết nối cơ sở dữ liệu MySQL bằng Python .
Cài đặt mô-đun trình kết nối MySQL. Sử dụng lệnh pip để cài đặt trình kết nối MySQL Python. .
Nhập mô-đun trình kết nối MySQL. .
Sử dụng phương thức connect[]. .
Sử dụng phương thức con trỏ []. .
Sử dụng phương thức exec[]. .
Trích xuất kết quả bằng cách sử dụng hàm tìm nạp [].
Đóng con trỏ và các đối tượng kết nối

Chúng ta có thể kết nối MySQL với Python không?

Python cần trình điều khiển MySQL để truy cập cơ sở dữ liệu MySQL . Trong hướng dẫn này, chúng tôi sẽ sử dụng trình điều khiển "MySQL Connector". Chúng tôi khuyên bạn nên sử dụng PIP để cài đặt "MySQL Connector". PIP rất có thể đã được cài đặt trong môi trường Python của bạn.

Trình kết nối MySQL Connect trả về cái gì?

Trình tạo connect[] tạo kết nối đến máy chủ MySQL và trả về đối tượng MySQLConnection .

Chủ Đề