7.1 Connector/Python 连接参数

可以使用 mysql.connector.connect() 函数或 mysql.connector.MySQLConnection() 类建立与 MySQL 服务器的连接。

cnx = mysql.connector.connect(user='joe', database='test')
cnx = MySQLConnection(user='joe', database='test')

下表描述了可用于启动连接的参数。参数后面的星号 (*) 表示同义参数名,仅为了与其他 Python MySQL 驱动程序兼容。Oracle 建议不要使用这些备用名称。

表 7.1 Connector/Python 的连接参数

参数名称 默认值 描述
user (username*) 用于对 MySQL 服务器进行身份验证的用户名。
password (passwd*) 用于对 MySQL 服务器验证用户的密码。
password1password2password3 用于多因素身份验证 (MFA);password1password 的别名。在 8.0.28 中添加。
database (db*) 与 MySQL 服务器连接时要使用的数据库名称。
host 127.0.0.1 MySQL 服务器的主机名或 IP 地址。
unix_socket Unix 套接字文件的路径。
port 3306 MySQL 服务器的 TCP/IP 端口。必须为整数。
conn_attrs

发送标准的 performance_schema.session_connect_attrs 值;使用 conn_attrs 可选择设置其他自定义连接属性,如由字典定义的属性,例如 config['conn_attrs'] = {"foo": "bar"}

c-ext 和纯 Python 实现不同。c-ext 实现依赖于 mysqlclient 库,因此其标准 conn_attrs 值源于该库。例如,使用 c-ext 时 '_client_name' 为 'libmysql',而使用纯 Python 时则为 'mysql-connector-python'。C-ext 添加了以下附加属性:'_connector_version'、'_connector_license'、'_connector_name' 和 '_source_host'。

此选项是在 8.0.17 中添加的,默认的 session_connect_attrs 行为也是在该版本中添加的。

init_command 在连接建立后立即执行的命令(SQL 查询),作为初始化过程的一部分。在 8.0.32 中添加。
auth_plugin 要使用的身份验证插件。在 1.2.1 中添加。
fido_callback

从 8.2.0 开始已弃用,并在 8.4.0 中移除;请改为使用 webauthn_callback

可选 fido_callback 选项定义的可调用对象将在准备与硬件 FIDO 设备交互时执行。此选项可以是可调用对象,也可以是连接器可以在运行时导入并执行的字符串路径。它不会阻塞,仅用于通知用户需要与硬件 FIDO 设备交互。

此功能仅在 C 扩展中可用。使用纯 Python 实现时,会引发 NotSupportedError

webauthn_callback

可选 webauthn_callback 选项定义的可调用对象将在准备与硬件 WebAuthn 设备交互时执行。此选项可以是可调用对象,也可以是连接器可以在运行时导入并执行的字符串路径。它不会阻塞,仅用于通知用户需要与硬件 FIDO 设备交互。启用连接配置中的 authentication_webauthn_client auth_plugin 以使用。

此选项是在 8.2.0 中添加的,它弃用了在 8.4.0 版本中移除的 fido_callback 选项。

use_unicode True 是否使用 Unicode。
charset utf8mb4 要使用的 MySQL 字符集。
collation utf8mb4_general_ai_ci (在 2.x 中为 utf8_general_ci) 要使用的 MySQL 排序规则。8.x 的默认值是从最新的 MySQL 服务器 8.0 默认值生成的。
autocommit False 是否自动提交事务。
time_zone 在连接时设置 time_zone 会话变量。
sql_mode 在连接时设置 sql_mode 会话变量。
get_warnings False 是否获取警告。
raise_on_warnings False 是否在出现警告时引发异常。
connection_timeout (connect_timeout*) TCP 和 Unix 套接字连接的超时时间。
client_flags MySQL 客户端标志。
buffered False 游标对象是否在执行查询后立即获取结果。
raw False MySQL 结果是否按原样返回,而不是转换为 Python 类型。
consume_results False 是否自动读取结果集。
tls_versions ["TLSv1.2", "TLSv1.3"] 支持的 TLS 版本;允许的版本是 TLSv1.2 和 TLSv1.3。TLSv1 和 TLSv1.1 在 Connector/Python 8.0.28 中已被移除。
ssl_ca 包含 SSL 证书颁发机构的文件。
ssl_cert 包含 SSL 证书文件的文件。
ssl_disabled False True 会禁用 SSL/TLS 使用。TLSv1 和 TLSv1.1 连接协议从 Connector/Python 8.0.26 开始已弃用,从 Connector/Python 8.0.28 开始已被移除。
ssl_key 包含 SSL 密钥的文件。
ssl_verify_cert False 设置为 True 时,会根据 ssl_ca 选项指定的证书文件检查服务器证书。任何不匹配都会导致 ValueError 异常。
ssl_verify_identity False 设置为 True 时,还会通过检查客户端用于连接到服务器的主机名与服务器发送给客户端的证书中的身份进行主机名身份验证。此选项在 Connector/Python 8.0.14 中添加。
force_ipv6 False 设置为 True 时,如果地址解析为 IPv4 和 IPv6,则会使用 IPv6。默认情况下,在这种情况下会使用 IPv4。
kerberos_auth_mode SSPI 仅限 Windows,用于在 Windows 上的 authentication_kerberos_client 身份验证插件运行时选择 SSPI 和 GSSAPI。此选项在 Connector/Python 8.0.32 中添加。
oci_config_file ""

可选择定义 authentication_oci 服务器端身份验证配置文件的特定路径。配置文件名称可以使用 oci_config_profile 配置。

在 Linux 和 macOS 上的默认文件路径为 ~/.oci/config,在 Windows 上为 %HOMEDRIVE%%HOMEPATH%\.oci\config

oci_config_profile "DEFAULT"

用于指定要从 OCI 配置文件使用的配置文件,该配置文件包含生成的临时密钥对和安全令牌。OCI 配置文件的位置可以使用 oci_config_file 定义。oci_config_profile 选项是在 Connector/Python 8.0.33 中添加的。

dsn 不支持(使用时会引发 NotSupportedError)。
pool_name 连接池名称。池名称限制为字母数字字符和特殊字符 ._*$#。池名称的长度不得超过 pooling.CNX_POOL_MAXNAMESIZE 个字符(默认值为 64)。
pool_size 5 连接池大小。池大小必须大于 0 且小于或等于 pooling.CNX_POOL_MAXSIZE(默认值为 32)。
pool_reset_session True 将连接返回到池时是否重置会话变量。
compress False 是否使用压缩的客户端/服务器协议。
converter_class 要使用的转换器类。
converter_str_fallback False 启用对 Connector/Python 转换器类或自定义转换器类不支持的值类型的 str 转换。
failover 服务器故障转移序列。
option_files 要读取的选项文件。在 2.0.0 中添加。
option_groups ['client', 'connector_python'] 要从选项文件中读取的组。在 2.0.0 中添加。
allow_local_infile True 是否启用 LOAD DATA LOCAL INFILE。在 2.0.0 中添加。
use_pure 从 8.0.11 开始为 False,在早期版本中为 True。如果只有一种实现(C 或 Python)可用,则默认值会设置为启用可用的实现。 是否使用纯 Python 或 C 扩展。如果 use_pure=False 且 C 扩展不可用,则 Connector/Python 会自动回退到纯 Python 实现。可以使用 mysql.connector.connect() 设置,但不能使用 MySQLConnection.connect() 设置。在 2.1.1 中添加。
krb_service_principal "@realm" 的默认值为默认区域,如 krb5.conf 文件中配置的区域。 必须为 "primary/instance@realm" 格式的字符串,例如 "ldap/[email protected]",其中 "@realm" 为可选。在 8.0.23 中添加。

MySQL 身份验证选项

使用 MySQL 进行身份验证通常使用 usernamepassword

当给出 database 参数时,当前数据库将设置为给定的值。要稍后更改当前数据库,请执行 USE SQL 语句或设置 MySQLConnection 实例的 database 属性。

默认情况下,Connector/Python 会尝试连接到本地主机上运行的 MySQL 服务器,使用 TCP/IP。host 参数默认为 IP 地址 127.0.0.1,port 默认为 3306。通过设置 unix_socket 支持 Unix 套接字。不支持 Windows 平台上的命名管道。

Connector/Python 支持从 MySQL 8.0 开始提供的身份验证插件,包括首选的 caching_sha2_password 身份验证插件。

已弃用的 mysql_native_password 插件受支持,但从 MySQL 服务器 8.4.0 开始默认情况下已禁用,从 MySQL 服务器 9.0.0 开始已被移除。

connect() 方法支持 auth_plugin 参数,该参数可用于强制使用特定身份验证插件。

注意

MySQL Connector/Python 不支持 MySQL 4.1 之前的版本中使用的老旧、安全性较低的密码协议。

Connector/Python 支持 Kerberos 身份验证协议 以实现无密码身份验证。Linux 客户端从 Connector/Python 8.0.26 开始支持,Windows 支持是在 Connector/Python 8.0.27 中使用 C 扩展实现添加的,并在 Connector/Python 8.0.29 中使用纯 Python 实现添加的。对于 Windows,相关的 kerberos_auth_mode 连接选项是在 8.0.32 中添加的,用于将模式配置为 SSPI(默认)或 GSSAPI(通过纯 Python 实现,或从 8.4.0 开始的 C 扩展实现)。虽然 Windows 支持这两种模式,但 Linux 仅支持 GSSAPI。

以下示例假设 LDAP 可插拔身份验证 已设置好以使用 GSSAPI/Kerberos SASL 身份验证

import mysql.connector as cpy
import logging

logging.basicConfig(level=logging.DEBUG)

SERVICE_NAME = "ldap"
LDAP_SERVER_IP = "server_ip or hostname"  # e.g., winexample01

config = {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "[email protected]",
    "password": "s3cret",
    "use_pure": True,
    "krb_service_principal": f"{SERVICE_NAME}/{LDAP_SERVER_IP}"
}

with cpy.connect(**config) as cnx:
    with cnx.cursor() as cur:
        cur.execute("SELECT @@version")
        res = cur.fetchone()
        print(res[0])

Connector/Python 从 v8.0.28 开始支持多因素身份验证 (MFA),方法是使用 password1password 的别名)、password2password3 连接选项。

Connector/Python 从 Connector/Python 8.2.0 开始支持 WebAuthn 可插拔身份验证,该功能在 MySQL 企业版中受支持。可以选择使用 Connector/Python 的 webauthn_callback 连接选项来通知用户需要触摸硬件设备。此功能存在于 C 实现中(使用 libmysqlclient),但纯 Python 实现需要 FIDO2 依赖项,该依赖项未与 MySQL 连接器一起提供,并假定已存在于您的环境中。可以使用以下命令独立安装它

$> pip install fido2

以前,现在已删除(从 8.4.0 版本开始)的 authentication_fido MySQL 服务器插件使用 fido_callback 选项支持,该选项存在于 C 扩展实现中。

字符编码

默认情况下,来自 MySQL 的字符串以 Python Unicode 字符串形式返回。要更改此行为,请将 use_unicode 设置为 False。您可以通过 charset 参数更改客户端连接的字符集设置。要更改连接到 MySQL 后的字符集,请设置 MySQLConnection 实例的 charset 属性。此方法优先于直接使用 SET NAMES SQL 语句。与 charset 属性类似,您可以设置当前 MySQL 会话的 collation

事务

autocommit 值默认为 False,因此不会自动提交事务。在执行一组相关的插入、更新和删除操作后,在您的应用程序中调用 MySQLConnection 实例的 commit() 方法。为了数据一致性和写入操作的高吞吐量,最好在使用 InnoDB 或其他事务表时关闭 autocommit 配置选项。

时区

可以使用 time_zone 参数为每个连接设置时区。例如,如果 MySQL 服务器设置为 UTC,并且应将 TIMESTAMP 值通过 MySQL 转换为 PST 时区返回,则此方法非常有用。

SQL 模式

MySQL 支持所谓的 SQL 模式,这些模式会全局或按连接更改服务器的行为。例如,要将警告作为错误引发,请将 sql_mode 设置为 TRADITIONAL。有关更多信息,请参见 服务器 SQL 模式

故障排除和错误处理

get_warnings 设置为 True 时,会自动获取查询生成的警告。您还可以通过将 raise_on_warnings 设置为 True 来立即引发异常。请考虑使用 MySQL 的 sql_mode 设置将警告转换为错误。

要设置连接的超时值,请使用 connection_timeout

使用客户端标志启用和禁用功能

MySQL 使用 客户端标志 来启用或禁用功能。使用 client_flags 参数,您可以控制设置的内容。要找出有哪些标志可用,请使用以下命令

from mysql.connector.constants import ClientFlag
print '\n'.join(ClientFlag.get_full_info())

如果未指定 client_flags(即为零),则对 MySQL 4.1 及更高版本使用默认值。如果指定大于 0 的整数,请确保正确设置所有标志。单独设置和取消设置标志的更好方法是使用列表。例如,要设置 FOUND_ROWS,但禁用默认的 LONG_FLAG

flags = [ClientFlag.FOUND_ROWS, -ClientFlag.LONG_FLAG]
mysql.connector.connect(client_flags=flags)

结果集处理

默认情况下,MySQL Connector/Python 不会缓冲或预取结果。这意味着在执行查询后,您的程序负责获取数据。这可以避免在查询返回大型结果集时过度使用内存。如果您知道结果集足够小,可以一次性处理所有结果,则可以通过将 buffered 设置为 True 来立即获取结果。也可以为每个游标设置此值(参见 第 10.2.6 节,“MySQLConnection.cursor() 方法”)。

查询生成的結果通常不会在客户端程序获取它们之前读取。要自动使用和丢弃结果集,请将 consume_results 选项设置为 True。结果是读取所有结果,对于大型结果集而言,这可能很慢。(在这种情况下,最好关闭并重新打开连接。)

类型转换

默认情况下,结果集中的 MySQL 类型会自动转换为 Python 类型。例如,DATETIME 列值将变为 datetime.datetime 对象。要禁用转换,请将 raw 选项设置为 True。您可能会这样做来获得更好的性能或自行执行不同类型的转换。

通过 SSL 连接

当您的 Python 安装支持 SSL 时,可以使用 SSL 连接,即当它针对 OpenSSL 库进行编译时。当您提供 ssl_cassl_keyssl_cert 选项时,连接将切换到 SSL,并且 client_flags 选项将自动包含 ClientFlag.SSL 值。您可以将其与 compressed 选项设置为 True 结合使用。

从 Connector/Python 2.2.2 开始,如果 MySQL 服务器支持 SSL 连接,Connector/Python 将尝试默认建立安全(加密)连接,否则将回退到非加密连接。

从 Connector/Python 1.2.1 到 Connector/Python 2.2.1,可以使用仅 ssl_ca 选项建立 SSL 连接。ssl_keyssl_cert 参数是可选的。但是,如果给出了其中一个,则必须给出两个,否则会引发 AttributeError

# Note (Example is valid for Python v2 and v3)
from __future__ import print_function

import sys

#sys.path.insert(0, 'python{0}/'.format(sys.version_info[0]))

import mysql.connector
from mysql.connector.constants import ClientFlag

config = {
    'user': 'ssluser',
    'password': 'password',
    'host': '127.0.0.1',
    'client_flags': [ClientFlag.SSL],
    'ssl_ca': '/opt/mysql/ssl/ca.pem',
    'ssl_cert': '/opt/mysql/ssl/client-cert.pem',
    'ssl_key': '/opt/mysql/ssl/client-key.pem',
}

cnx = mysql.connector.connect(**config)
cur = cnx.cursor(buffered=True)
cur.execute("SHOW STATUS LIKE 'Ssl_cipher'")
print(cur.fetchone())
cur.close()
cnx.close()

连接池

当存在 pool_namepool_size 参数时,Connector/Python 会创建新的池。如果未给出 pool_name 参数,则 connect() 调用会自动生成名称,该名称由给出的 hostportuserdatabase 连接参数组成,顺序为从左到右。如果未给出 pool_size 参数,则默认大小为 5 个连接。

pool_reset_session 允许控制将连接返回到池时是否重置会话变量。默认行为是重置它们。

有关连接池的更多信息,请参见 第 9.4 节,“Connector/Python 连接池”

协议压缩

布尔值 compress 参数指示是否使用压缩的客户端/服务器协议(默认值为 False)。这为设置 ClientFlag.COMPRESS 标志提供了一种更简单的替代方法。此参数从 Connector/Python 1.1.2 开始可用。

转换器类

converter_class 参数接受一个类并在配置连接时设置它。如果自定义转换器类不是 conversion.MySQLConverterBase 的子类,则会引发 AttributeError

服务器故障转移

connect() 方法接受一个 failover 参数,该参数提供有关在连接失败时用于服务器故障转移的信息。参数值是字典的元组或列表(元组更可取,因为它不可变)。每个字典都包含故障转移序列中给定服务器的连接参数。允许的字典值是:userpasswordhostportunix_socketdatabasepool_namepool_size。此故障转移选项是在 Connector/Python 1.2.1 中添加的。

选项文件支持

从 Connector/Python 2.0.0 开始,选项文件使用两个选项支持 connect()

  • option_files:要读取的选项文件。该值可以是文件路径名(字符串)或路径名字符串序列。默认情况下,Connector/Python 不会读取任何选项文件,因此必须显式给出此参数才能读取选项文件。文件按指定的顺序读取。

  • option_groups:如果读取选项文件,则要从中读取的组。该值可以是选项组名称(字符串)或组名称字符串序列。如果未给出此参数,则默认值为 ['client', 'connector_python'],以读取 [client][connector_python] 组。

有关更多信息,请参见 第 7.2 节,“Connector/Python 选项文件支持”

LOAD DATA LOCAL INFILE

在 Connector/Python 2.0.0 之前,要启用使用 LOAD DATA LOCAL INFILE,客户端必须显式设置 ClientFlag.LOCAL_FILES 标志。从 2.0.0 开始,此标志默认启用。要禁用它,可以在连接时将 allow_local_infile 连接选项设置为 False(默认值为 True)。

与其他连接接口的兼容性

passwddbconnect_timeout 对其他 MySQL 接口有效,分别与 passworddatabaseconnection_timeout 相同。后者的优先级更高。数据源名称语法或 dsn 不使用;如果指定了它,则会引发 NotSupportedError 异常。

客户端/服务器协议实现

Connector/Python 可以使用纯 Python 接口连接到 MySQL,也可以使用使用 MySQL C 客户端库的 C 扩展。 use_pure mysql.connector.connect() 连接参数决定使用哪个。Connector/Python 8 中的默认值从 True(使用纯 Python 实现)更改为 False。设置 use_pure 会更改所使用的实现。

use_pure 参数从 Connector/Python 2.1.1 开始可用。有关 C 扩展的更多信息,请参见 第 8 章,Connector/Python C 扩展