可以使用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 ,password2 和
password3
|
对于多重身份验证 (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 |
发送标准
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 |
此功能仅在 C 扩展中可用。使用 纯 Python 实现时会引发 NotSupportedError 。 |
|
use_unicode |
True |
是否使用Unicode。 |
charset |
utf8mb4 |
使用哪个 MySQL 字符集。 |
collation |
utf8mb4_general_ai_ci (
utf8_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 |
"" |
|
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=False C 扩展不可用,则连接器/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 的身份验证通常使用
username
和password
。
给出参数时database
,当前数据库设置为给定值。稍后要更改当前数据库,请执行USE
SQL 语句或设置实例
的database
属性
。MySQLConnection
默认情况下,Connector/Python 尝试使用 TCP/IP 连接到在本地主机上运行的 MySQL 服务器。该host
参数默认为 IP 地址 127.0.0.1 和port
3306。设置 支持 Unix 套接字
unix_socket
。不支持 Windows 平台上的命名管道。
连接器/Python 支持自 MySQL 5.6 起可用的身份验证插件。这包括mysql_clear_password
和
sha256_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 通过使用(别名
password
)password2
、和
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_unicode
为False
。您可以通过参数更改客户端连接的字符设置charset
。要在连接到 MySQL 后更改字符集,请设置实例的charset
属性。MySQLConnection
这种技术优于SET NAMES
直接使用 SQL 语句。与该charset
属性类似,您可以collation
为当前的 MySQL 会话设置。
交易
该autocommit
值默认为
False
,因此不会自动提交事务。在执行一组相关的插入、更新和删除操作后,在您的应用程序中调用实例的commit()
方法
。MySQLConnection
对于写入操作的数据一致性和高吞吐量,最好
在使用或其他事务表
autocommit
时关闭配置选项。InnoDB
时区
可以使用
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 连接器/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_key
和
ssl_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
opion 建立 SSL 连接。ssl_key
和ssl_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_name
或
pool_size
参数,连接器/Python 创建新池。如果pool_name
未给出参数,则connect()
调用会自动生成名称,该名称由给出的
host
、port
、
user
和database
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
可以将连接选项设置为False
at connect time(默认为
True
)。
与其他连接接口的兼容性
passwd
,db
和
connect_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 扩展。