新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/27 7:53:57来源:尧图网络
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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

《创业之路》-965-华夏综合神佛仙圣等级体系 2026/9/27 9:32:57

《创业之路》-965-华夏综合神佛仙圣等级体系

华夏综合神佛仙圣等级体系说明:上古神话、道教、佛教、儒教、《封神演义》、《西游记》分属不同来源,原本不存在统一世界观。下文属于文化整合构建,并非单一原著设定,剔除现代洪荒网文(无创世元灵)。 整体层…

阅读更多 →
一文搞懂专门学设计的网站:3步搞定性能与美观 2026/9/27 9:32:57

一文搞懂专门学设计的网站:3步搞定性能与美观

一文搞懂专门学设计的网站:3步搞定性能与美观 模板网站太丑不够用?很多项目经理在交付时发现,套皮出来的页面像“大众脸”,客户一眼看穿没诚意,验收卡壳、返工频繁。专门学设计的网站,不是堆砌炫酷动效,而是用规范把“好看”变成可复制的工程标准。本…

阅读更多 →
第243篇_民宿短租平台房源与评价采集 2026/9/27 9:32:50

第243篇_民宿短租平台房源与评价采集

【Python爬虫实战】第243篇:房源表和评价表一起拉——民宿短租平台房源信息与用户评价全量抓取实战 所属专栏:【Python爬虫实战】从零到企业级爬虫工程师(CSDN 付费专栏) 本篇篇目:第 243 篇(垂直行业数据采集专题) 难度等级:中级,双表关联采集 阅读时长:约 35 分钟(…

阅读更多 →
rtl_433 JSON 数据输出格式详解:字段规范、单位转换与消息完整性校验 2026/9/27 9:32:50

rtl_433 JSON 数据输出格式详解:字段规范、单位转换与消息完整性校验

物联网 【免费下载链接】rtl_433 Program to decode radio transmissions from devices on the ISM bands (and other frequencies) 项目地址: https://gitcode.com/gh_mirrors/rt/rtl_433 点击查看 免费下载 导读 rtl_433 是一款用于解码 ISM 频段(以…

阅读更多 →
NodeMCU file_lfs 模块实战:将任意文件嵌入 Lua Flash Store 并透明读写 2026/9/27 9:32:42

NodeMCU file_lfs 模块实战:将任意文件嵌入 Lua Flash Store 并透明读写

物联网嵌入式 【免费下载链接】nodemcu-firmware Lua based interactive firmware for ESP8266, ESP8285 and ESP32 项目地址: https://gitcode.com/gh_mirrors/no/nodemcu-firmware 点击查看 免费下载 本指南围绕 NodeMCU 固件仓库中的 file_lfs 模块文档 展开&am…

阅读更多 →
计及需求侧响应日前、日内两阶段鲁棒备用优化附Matlab代码 2026/9/27 9:32:42

计及需求侧响应日前、日内两阶段鲁棒备用优化附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、算法改进、程序设计科研仿真。🍎 往期回顾关注个人主页:完整代码获取 定制创新 论文复现私信🍊个人信条:做科研&#xff0c…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉