7.1 连接器/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 连接器/Python 的连接参数

参数名称 默认 描述
user( username*) 用于向 MySQL 服务器进行身份验证的用户名。
password( passwd*) 使用 MySQL 服务器验证用户的密码。
password1,password2password3 对于多重身份验证 (MFA);password1是 的别名password。在 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 值源自它。例如,'_client_name' 是带有 c-ext 的 '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

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

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

use_unicode True 是否使用Unicode。
charset utf8mb4 使用哪个 MySQL 字符集。
collation utf8mb4_general_ai_ciutf8_general_ci在 2.x 使用哪种 MySQL 排序规则。8.x 默认值是从最新的 MySQL Server 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 错误的 是否自动读取结果集。
tls_versions ["TLSv1.2", "TLSv1.3"] 支持的 TLS 版本;允许的版本是 TLSv1.2 和 TLSv1.3。Connector/Python 8.0.28 中删除了 TLSv1 和 TLSv1.1 版本。
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,通过检查客户端用于连接到服务器的主机名与服务器发送给客户端的证书中的身份,另外执行主机名身份验证。连接器/Python 8.0.14 中添加的选项。
force_ipv6 False 设置为True时,当地址同时解析为 IPv4 和 IPv6 时使用 IPv6。默认情况下,在这种情况下使用 IPv4。
oci_config_file ""

authentication_oci(可选)定义服务器端身份验证配置文件 的特定路径 。

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 启用连接器/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 False从 8.0.11 开始,True在更早的版本中。如果只有一种实现(C 或 Python)可用,则默认值设置为启用可用的实现。 是使用纯 Python 还是 C Extension。如果 use_pure=FalseC 扩展不可用,则连接器/Python 将自动回退到纯 Python 实现。可以用 mysql.connector.connect()设置,但不能 用 MySQLConnection.connect()设置。在 2.1.1 中添加。
krb_service_principal “@realm”默认为 krb5.conf文件中配置的默认领域。 必须是“primary/instance@realm”形式的字符串,例如“ldap/ldapauth@MYSQL.COM”,其中“@realm”是可选的。在 8.0.23 中添加。

MySQL 身份验证选项

MySQL 的身份验证通常使用 usernamepassword

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

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

连接器/Python 支持自 MySQL 5.6 起可用的身份验证插件。这包括mysql_clear_passwordsha256_password,两者都需要 SSL 连接。该sha256_password插件无法在非 SSL 连接上工作,因为连接器/Python 不支持 RSA 加密。

connect()方法支持 auth_plugin可用于强制使用特定插件的参数。例如,如果服务器配置为sha256_password默认使用并且您想要连接到使用 进行身份验证的帐户,请 mysql_native_password使用 SSL 连接或指定auth_plugin='mysql_native_password'

笔记

MySQL 连接器/Python 不支持 4.1 之前的 MySQL 版本的旧的、安全性较低的密码协议。

Connector/Python 支持用于无密码身份验证的 Kerberos 身份验证协议。从 Connector/Python 8.0.26 开始支持 Linux 客户端,Windows 支持在 Connector/Python 8.0.27 中添加了 C 扩展实现,在 Connector/Python 8.0.29 中添加了纯 Python 实现。

password1从 v8.0.28 开始,连接器/Python 通过使用(别名 passwordpassword2、和 password3连接选项 支持多因素身份验证 (MFA) 。

从 Connector/Python 8.0.29 开始, Connector/Python 支持FIDO 可插拔身份验证;MySQL企业版8.0.27新增的认证机制。

限制:FIDO 认证功能仅在 C 扩展实现中可用(默认安装);使用 此连接器的纯 Python 实现时会引发NotSupportedError 。也只支持 2 级结构,因为连接器和物理密钥在同一台机器上。

有关安装详细信息,请参阅FIDO 可插入身份验证,并可选择使用连接器/Python fido_callback 连接选项来通知用户他们需要触摸硬件设备。

字符编码

默认情况下,来自 MySQL 的字符串作为 Python Unicode 文字返回。要更改此行为,请设置 use_unicodeFalse。您可以通过参数更改客户端连接的字符设置charset。要在连接到 MySQL 后更改字符集,请设置实例的charset 属性。MySQLConnection这种技术优于SET NAMES 直接使用 SQL 语句。与该charset 属性类似,您可以collation为当前的 MySQL 会话设置。

交易

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

时区

可以使用 time_zone参数为每个连接设置时区。这很有用,例如,如果 MySQL 服务器设置为 UTC,并且 TIMESTAMPMySQL 返回的值应转换PST为时区。

SQL模式

MySQL 支持所谓的 SQL 模式。全局或每个连接更改服务器的行为。例如,要将警告作为错误引发,请设置sql_modeTRADITIONAL. 有关详细信息,请参阅 服务器 SQL 模式

故障排除和错误处理

get_warnings当设置为 时,查询生成的警告会自动获取 Trueraise_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 连接器/Python 不会缓冲或预取结果。这意味着在执行查询后,您的程序负责获取数据。这可以避免在查询返回大型结果集时过度使用内存。如果您知道结果集小到足以一次处理所有结果,则可以通过设置buffered为 来 立即获取结果True。也可以为每个游标设置它(请参阅 第 10.2.6 节,“MySQLConnection.cursor() 方法”)。

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

类型转换

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

通过 SSL 连接

当您的Python 安装支持 SSL时,即针对 OpenSSL 库进行编译时, 可以使用 SSL 连接 。当您提供 ssl_ca,ssl_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_caopion 建立 SSL 连接。ssl_keyssl_cert 参数是可选的。但是,当给出其中一个时,必须同时给出或AttributeError引发 an。

# 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参数,连接器/Python 创建新池。如果pool_name未给出参数,则connect()调用会自动生成名称,该名称由给出的 hostportuserdatabase connection 参数中的任何一个组成,并按该顺序排列。如果 pool_size未给出参数,则默认大小为 5 个连接。

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

有关连接池的其他信息,请参阅 第 9.1 节,“连接器/Python 连接池”

协议压缩

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

转换器类

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

服务器故障转移

connect()方法接受一个 failover参数,该参数提供在连接失败时用于服务器故障转移的信息。参数值是元组或字典列表(元组是首选,因为它是不可变的)。每个字典都包含故障转移序列中给定服务器的连接参数。允许的字典值为:user, password, host, port, unix_socket, database, pool_name, pool_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 节,“连接器/Python 选项文件支持”

加载数据本地文件

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

与其他连接接口的兼容性

passwd,dbconnect_timeout与其他 MySQL 接口的兼容性有效,分别与 password,database和 相同connection_timeout。后者优先。数据源名称语法或未dsn使用;如果指定,它会引发NotSupportedError 异常。

客户端/服务器协议实现

连接器/Python 可以使用 MySQL 的纯 Python 接口,或使用 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 章,连接器/Python C 扩展