PyMySQL 纯 Python 驱动使用指南:安装、连接认证与实战示例

发布时间:2026/9/27 7:54:08
PyMySQL 纯 Python 驱动使用指南:安装、连接认证与实战示例 数据库数据库客户端后端【免费下载链接】PyMySQLMySQL client library for Python项目地址https://gitcode.com/gh_mirrors/py/PyMySQL点击查看免费下载PyMySQL 是一个完全由 Python 实现的 MySQL / MariaDB 客户端库整个连接与协议处理不依赖任何 C 扩展并遵循 DB-API 2.0PEP 249规范。本文基于仓库根目录 README.md 展开结合 pymysql/connections.py、pymysql/_auth.py 等源码系统讲解环境要求、安装方式含可选认证依赖、核心连接参数、认证机制与一个完整的读写示例帮助你在 CPython 或 PyPy 环境下快速接入 MySQL / MariaDB并理解参数背后的底层实现。PyMySQL 是什么PyMySQL 的核心定位是一个pure-Python的 MySQL 与 MariaDB 客户端库即客户端通信协议、认证、类型转换等全部由 Python 代码实现无需编译安装 C 扩展因此对跨平台部署和虚拟环境非常友好。它对外提供符合 DB-API 2.0PEP 249的数据库 API包括connect()、Connection、Cursor、异常层级、Date/Time/Timestamp构造等标准接口见 pymysql/init.py 中导出的符号。从包结构看核心模块分工清晰pymysql/connections.pyConnection类的完整实现负责建立套接字连接、发送认证请求、执行查询与事务管理pymysql/cursors.pyCursor及其变体DictCursor、SSCursor等pymysql/_auth.py各种 MySQL / MariaDB 认证插件的握手实现pymysql/converters.pyPython 对象与 SQL 字面量、MySQL 字段之间的编码转换pymysql/err.pyDB-API 2.0 异常层级Error、OperationalError、ProgrammingError等pymysql/charset.py、pymysql/protocol.py字符集映射与协议报文编解码。环境要求根据 README.md 的 Requirements 一节使用 PyMySQL 需要满足两个层面的要求Python支持 CPython 3.9 及更新版本或 PyPy 最新的 3.x 版本。这一约束与 pyproject.toml 中requires-python 3.9一致项目本身没有任何运行时第三方依赖dependencies []。数据库服务器MySQL LTS 版本或 MariaDB LTS 版本均可因为 PyMySQL 直接实现了 MySQL 客户端/服务器协议两者在该协议层面兼容。安装 PyMySQL包已发布到 PyPI直接使用 pip 安装python3 -m pip install PyMySQL认证插件的可选依赖默认安装仅覆盖mysql_native_password等无需额外第三方库的认证方式。若需要使用以下认证方式还需安装对应的额外依赖# 支持 sha256_password 或 caching_sha2_password 认证 python3 -m pip install PyMySQL[rsa] # 支持 MariaDB 的 ed25519 认证 python3 -m pip install PyMySQL[ed25519]这两个可选依赖在 pyproject.toml 的[project.optional-dependencies]中有明确声明rsa额外依赖cryptography46.0.7ed25519额外依赖PyNaCl1.6.2。其必要性可以从源码层面得到印证在 pymysql/_auth.py 中sha256_password_auth与caching_sha2_password_auth依赖cryptography提供的 RSA 加解密与公钥序列化能力文件开头通过try: from cryptography...导入并设置_have_cryptography标志而ed25519_password则依赖PyNaCl的 ed25519 绑定from nacl import bindings。当对应依赖缺失时使用这些认证方式会报错这正是[rsa]/[ed25519]两种安装变体的由来。提示MySQL 8 默认用户认证插件为caching_sha2_password如果你的服务端使用默认配置建议直接安装PyMySQL[rsa]避免运行时因缺少依赖而无法认证。快速上手一个完整的读写示例README.md 给出了一个从建表到插入、提交、查询的完整示例。先准备一张users表CREATE TABLE users ( id int(11) NOT NULL AUTO_INCREMENT, email varchar(255) COLLATE utf8_bin NOT NULL, password varchar(255) COLLATE utf8_bin NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_bin AUTO_INCREMENT1 ;然后通过 PyMySQL 连接并操作这张表import pymysql.cursors # Connect to the database connection pymysql.connect( hostlocalhost, useruser, passwordpasswd, databasedb, cursorclasspymysql.cursors.DictCursor, ) with connection: with connection.cursor() as cursor: # Create a new record sql INSERT INTO users (email, password) VALUES (%s, %s) cursor.execute(sql, (webmasterpython.org, very-secret)) # connection is not autocommit by default. So you must commit to save # your changes. connection.commit() with connection.cursor() as cursor: # Read a single record sql SELECT id, password FROM users WHERE email%s cursor.execute(sql, (webmasterpython.org,)) result cursor.fetchone() print(result)运行后将打印{password: very-secret, id: 1}这个示例包含几个值得注意的要点参数化查询SQL 中使用%s占位符并通过元组传参。库的paramstyle声明为pyformat见 pymysql/init.py 中的paramstyle pyformat但%s位置参数风格同样受支持。参数会在 pymysql/converters.py 中经过escape_item/escape_str等函数做类型化转义避免手工拼接 SQL 带来的注入风险。DictCursor的作用cursorclasspymysql.cursors.DictCursor使结果行以字典形式返回因此fetchone()得到的是{password: ..., id: 1}而非元组。其实现位于 pymysql/cursors.py 的DictCursorMixin._conv_row通过dict(zip(self._fields, row))将字段名与行值配对。事务提交PyMySQL 默认不开启自动提交autocommitFalse所以写操作后必须显式调用connection.commit()才会真正落库。with connection:上下文管理器在退出时只会调用close()见 pymysql/connections.py 中__enter__/__exit__的实现__exit__仅执行self.close()并不会代替你提交事务。若希望在每条语句后自动提交可传入autocommitTrue或调用connection.autocommit(True)该方法在 pymysql/connections.py 中通过发送SET AUTOCOMMIT消息实现。游标即上下文管理器connection.cursor()返回的游标同样支持with语句退出时自动关闭游标并耗尽剩余数据。核心连接参数详解pymysql.connect()实际是pymysql.connections.Connection的工厂入口Connect connect Connection见 pymysql/init.py。Connection.__init__的完整签名与参数文档位于 pymysql/connections.py下面按用途分组说明。主机与传输方式host数据库服务器地址默认localhostportTCP 端口默认0随后会被归一化为 3306。源码中self.port port or 3306且会校验其类型必须为intdatabase默认连接的数据库名可传None表示不指定unix_socket使用 Unix 套接字而非 TCP/IP 连接。源码中当unix_socket非空时优先走socket.socket(socket.AF_UNIX, ...)此时host_info显示为Localhost via UNIX socketbind_address客户端有多个网卡时指定从哪个本机地址发起连接主机名或 IP。在Connection.connect()pymysql/connections.py中可以看到TCP 路径使用socket.create_connection((host, port), connect_timeout)建立连接并对套接字设置TCP_NODELAY与SO_KEEPALIVE随后依次调用_get_server_information()读取服务端信息与_request_authentication()发起认证握手。超时控制connect_timeout建连超时默认 10 秒源码校验范围0 connect_timeout 31536000超出会抛出ValueErrorread_timeout读超时秒默认None表示不超时且必须 0write_timeout写超时秒默认None同样要求 0。字符集与排序规则charset连接使用的字符集推荐utf8或utf8mb4。文档特别提醒遗留的多字节编码可能带来安全风险不建议在面向公网的系统上使用。默认值来自DEFAULT_CHARSET连接建立后通过charset_by_name(self.charset)解析出实际 Python 编码collation排序规则名称可显式指定sql_mode连接建立后要设置的默认SQL_MODEuse_unicode是否默认使用 Unicode 字符串默认True。事务、文件加载与报文大小autocommit自动提交模式False表示关闭README 示例即基于此需要显式commit()None表示使用服务端默认值local_infile是否允许LOAD DATA LOCAL INFILE默认False。启用时源码会向client_flag追加CLIENT.LOCAL_FILESmax_allowed_packet发送给服务端的报文最大字节数默认 16MB16 * 1024 * 1024主要用于限制LOAD LOCAL INFILE的数据包大小。SSL/TLSPyMySQL 支持两种 SSL 配置方式传入ssl.SSLContext实例或ssl字典参数类似mysql_ssl_set()的参数传字典的方式已标记为弃用建议改用独立参数或SSLContext使用独立参数ssl_caPEM 格式 CA 证书路径、ssl_cert客户端证书路径、ssl_key私钥路径、ssl_key_password私钥密码、ssl_verify_cert校验服务端证书有效性、ssl_verify_identity校验服务端身份、ssl_disabled显式禁用 TLS即使服务端支持也不使用。源码实现上Connection._create_ssl_ctx未显式指定 SSL 参数时进入PREFERRED模式即尝试建立 TLS 连接若服务端不支持则优雅回退指定了 CA 等参数则强制要求 TLSself._ssl_required True并追加CLIENT.SSL标志。值得注意的细节是Python 3.13 起默认启用VERIFY_X509_STRICT但 MySQL 自动生成的自签名证书通常无法通过该校验因此源码会显式移除该 flagctx.verify_flags ~ssl.VERIFY_X509_STRICT。配置文件读取read_default_file指定my.cnf文件路径从中读取[client]段的参数read_default_group要读取的配置分组名默认client。实现上当只传read_default_group而未传read_default_file时源码会根据平台选择默认配置文件Windows 下为c:\my.ini其他平台为/etc/my.cnf。随后通过Parser()读取配置并将user、password、host、database、socket、port、bind-address、default-character-set、ssl-*等键作为对应参数的兜底值显式传入的参数优先。具体键名映射见 pymysql/connections.py 中_config的调用序列。游标、转换与初始化cursorclass自定义游标类默认Cursor可传DictCursor、SSCursor或自定义子类conv类型转换字典替代默认转换表源码将其拆分为encodersPython 对象 → SQL 字面量与decodersMySQL 字段类型 → Python 对象两部分默认值来自 pymysql/converters.py 的conversionsinit_command连接建立后立即执行的初始 SQL 语句defer_connect为True时不立即建连等待显式调用connect()便于先构造连接对象再补参数binary_prefix是否在字节串字面量前加_binary前缀program_name随连接属性上报的程序名_connect_attrs中包含_client_name、_client_version、_pid见 pymysql/connections.pyauth_plugin_map插件名到自定义认证处理类的映射实验性。已弃用与不支持参数passwd、db已弃用分别用password、database替代传入时会发出DeprecationWarningcompress、named_pipe参数占位存在但不支持传入会直接抛出NotImplementedError源码注释明确标注 not supported。认证机制从握手到可选依赖PyMySQL 根据服务端返回的认证插件自动选择合适的握手实现相关代码集中在 pymysql/_auth.pymysql_native_password默认且无需额外依赖通过scramble_native_password完成 SHA1 加扰运算旧式 Native41 方案caching_sha2_passwordMySQL 8 默认认证方式caching_sha2_password_auth实现完整支持需要cryptography即PyMySQL[rsa]sha256_password需要 RSA 加密传输密码sha256_password_auth实现同样依赖cryptographyed25519MariaDB 的client_ed25519插件ed25519_password实现依赖PyNaCl即PyMySQL[ed25519]。此外连接对象支持server_public_key参数用于直接提供服务端公钥避免在非加密连接上从服务端获取公钥。DB-API 2.0 兼容性与 mysqlclient 兼容层作为 DB-API 2.0 实现pymysql/init.py 声明了标准模块级属性apilevel 2.0threadsafety 1线程间可共享连接但同一时刻只能单线程使用paramstyle pyformat。同时提供了类型对象STRING、BINARY、NUMBER、DATE、TIME、TIMESTAMP等DBAPISet子类与Date/Time/Timestamp系列构造函数满足 PEP 249 对模块接口的要求。针对大量使用MySQLdbmysqlclient的既有项目PyMySQL 还内置了一套兼容层install_as_MySQLdb()调用后sys.modules[MySQLdb] sys.modules[pymysql]任何import MySQLdb的应用将透明地使用 PyMySQL对外暴露__version__ 2.2.8与version_info (2, 2, 8, final, 1)与 mysqlclient 的版本语义对齐Django 会检查该版本号而 PyMySQL 自身版本为 1.2.3VERSION_STRING在 pyproject.toml 中通过version {attr pymysql.VERSION_STRING}动态读取。更多可深入的方向仓库在线文档目录位于 docs/source/index.rst包含 连接与游标说明、用户指南 等章节变更记录见 CHANGELOG.md许可证为 MIT详见 LICENSE测试用例集中在 pymysql/tests/如 test_connection.py、test_basic.py、test_DictCursor.py以及 ci/test_mysql.py 的 CI 集成测试可作为阅读协议实现与验证行为的学习素材若需在生产中处理超大结果集可关注 pymysql/cursors.py 中的SSCursor无缓冲游标边遍历边取行省内存与DictCursor的行为差异。综上从 pip 安装、认证依赖选择到连接参数与上下文管理PyMySQL 提供了一条从能用到用好的清晰路径。理解 pymysql/connections.py 中的参数语义与 pymysql/_auth.py 的认证流程能帮助你在不同 MySQL / MariaDB 版本与安全配置下快速定位连接问题。赞分享数据库数据库客户端后端【免费下载链接】PyMySQLMySQL client library for Python项目地址https://gitcode.com/gh_mirrors/py/PyMySQL点击查看免费下载相关推荐pg8000: Python连接PostgreSQL的纯Python驱动pg8000: Python连接PostgreSQL的纯Python驱动 项目介绍 pg8000是一款用于Python的PostgreSQL数据库接口它提供了AWX CLIawxkit完全使用指南安装、认证、资源操作与实战示例AWX CLIawxkit完全使用指南安装、认证、资源操作与实战示例 AWX 提供了 Web 界面、REST API 以及基于 Ansible 的任务引擎后端运维任务调度PyMySQL纯Python MySQL驱动库全面解析PyMySQL纯Python MySQL驱动库全面解析 PyMySQL是一个纯Python实现的MySQL数据库客户端库完全遵循Python数据库API规范数据库数据库客户端后端上一篇从0到1解决Refine项目中自定义查询失效难题7大场景3种调试方案下一篇革命性AI开发工具Get Shit Done彻底解决Claude上下文衰退难题创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考