本文重点是 六、避坑指南核心重点的第四点mysql.connector 不兼容 MySQL 8.0 认证方式或 DNS 反向解析超时改用 PyMySQLz用局域网的另一台电脑访问本机MySQL数据时用Navicat查询没问题但是python代码查询时不报错也没有数据返回。其实时链接数据库是卡死了直接退出了程序。原因就是mysql.connector 的包不行PyMySQL这个包可以。一、需求背景最近需要实现一个「局域网数据同步系统」核心需求本机每 3 秒采集时间数据写入 MySQL 数据库自动从时间字段中提取年 / 月 / 日补全对应字段局域网内其他电脑可通过代码查询数据库实时获取数据稳定不丢数据、不卡死、跨设备兼容。最终实现了「3 件套」程序自动上传 自动补全 跨机查询全程踩了 N 个坑特此整理成教程帮大家少走弯路二、技术选型工具 / 框架选择理由替代方案对比MySQL 8.0免费、稳定、支持局域网并发SQLite不支持网络共享、Access易损坏PyMySQLPython 连接 MySQL 的稳定驱动mysql.connector局域网易卡死不推荐Navicat可视化管理数据库方便调试phpMyAdmin网页版操作繁琐关键选型逻辑文件型数据库SQLite/Access不适合局域网频繁写入直接选择 C/S 架构的 MySQL从根源避免数据丢失、锁表问题。三、前置准备1. 环境配置服务器端部署 MySQLWindows 10/11 MySQL 8.0客户端查询 / 上传Windows 10/11 Python 3.8网络所有设备在同一局域网路由器 / 交换机连接2. MySQL 基础配置1安装 MySQL推荐用 XAMPP 一键安装免配置或官网下载安装包记住主机localhost服务器本机端口3306默认用户名root密码自定义本文示例用 1234562创建数据库和表用 Navicat 连接本机 MySQL执行以下 SQL-- 创建数据库本文库名hnxCREATE DATABASE IF NOT EXISTS hnx CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;-- 切换数据库USE hnx;-- 创建数据表存储时间数据CREATE TABLE IF NOT EXISTS upload_data (id INT PRIMARY KEY AUTO_INCREMENT, -- 自增IDtime_full VARCHAR(20) NOT NULL, -- 完整时间格式20250103123456year VARCHAR(4), -- 提取的年month VARCHAR(2), -- 提取的月day VARCHAR(2) -- 提取的日);四、核心程序实现全套代码1. 程序 1每 3 秒自动上传时间数据服务器 / 本机功能持续采集当前时间写入 MySQL支持后台运行。# 安装依赖pip install pymysqlimport pymysqlimport timefrom datetime import datetime# 配置信息根据实际修改CONFIG {host: localhost, # 服务器本机IPlocalhost/192.168.3.1user: root,password: 123456,database: hnx,port: 3306,charset: utf8mb4}def connect_db():创建数据库连接return pymysql.connect(**CONFIG, connect_timeout5)def upload_time_data():每3秒上传一次时间数据conn connect_db()cursor conn.cursor()print(✅ 数据上传程序启动每3秒上传一条数据CtrlC停止)try:while True:# 获取当前时间年月日时分秒time_full datetime.now().strftime(%Y%m%d%H%M%S)# 插入数据只传完整时间年/月/日后续自动补全sql INSERT INTO upload_data (time_full) VALUES (%s)cursor.execute(sql, (time_full,))conn.commit()print(f✅ 上传成功 | 时间{time_full})time.sleep(3)except KeyboardInterrupt:print(\n 程序手动停止)finally:cursor.close()conn.close()if __name__ __main__:upload_time_data()2. 程序 2自动补全年 / 月 / 日服务器 / 本机功能扫描表中year为空的数据从time_full提取年 / 月 / 日并补全。import pymysqlimport time# 同上面的CONFIG配置CONFIG {host: localhost,user: root,password: 123456,database: hnx,port: 3306,charset: utf8mb4}def connect_db():return pymysql.connect(**CONFIG, connect_timeout5)def auto_fill_date():print(✅ 自动补全年月日程序启动PyMySQL版)print( 正在扫描需要补全的数据...\n)while True:try:conn connect_db()cursor conn.cursor()# 1. 查询year为空的数据select_sql SELECT id, time_full FROM upload_data WHERE year IS NULL OR year cursor.execute(select_sql)empty_data cursor.fetchall()if not empty_data:print(⏳ 暂无需要补全的数据10秒后重试...)time.sleep(10)continue# 2. 逐条提取并更新for data_id, time_full in empty_data:if len(time_full) 8: # 确保时间格式正确year time_full[0:4] # 前4位年month time_full[4:6] # 第5-6位月day time_full[6:8] # 第7-8位日# 更新数据update_sql UPDATE upload_dataSET year %s, month %s, day %sWHERE id %scursor.execute(update_sql, (year, month, day, data_id))conn.commit()print(f✅ 补全成功 | ID:{data_id} | {year}年{month}月{day}日)cursor.close()conn.close()time.sleep(3) # 每3秒扫描一次except Exception as e:print(f❌ 出错重试{str(e)})time.sleep(3)if __name__ __main__:auto_fill_date()3. 程序 3局域网跨机查询数据客户端功能局域网内任意电脑通过服务器 IP 查询数据库显示所有数据。import pymysql# 配置信息重点host改为服务器IPCONFIG {host: 192.168.3.1, # 服务器局域网IP不是localhostuser: root,password: 123456,database: hnx,port: 3306,charset: utf8mb4}def connect_db():return pymysql.connect(**CONFIG, connect_timeout5)def query_data():try:conn connect_db()cursor conn.cursor()# 查询所有数据按ID排序query_sql SELECT id, time_full, year, month, day FROM upload_data ORDER BY id ASCcursor.execute(query_sql)all_data cursor.fetchall()# 格式化输出print( * 70)print( 局域网MySQL查询结果hnx.upload_data)print( * 70)for row in all_data:data_id, time_full, year, month, day rowprint(fID:{data_id:3} | 完整时间:{time_full} | 年:{year or 未填} | 月:{month or 未填} | 日:{day or 未填})print(f\n✅ 共查询到 {len(all_data)} 条数据)cursor.close()conn.close()except Exception as e:print(f❌ 查询失败{str(e)})if __name__ __main__:query_data()五、关键配置让 MySQL 支持局域网访问这是跨机查询的核心少一步都不行1. 授权局域网用户访问在服务器端部署 MySQL 的电脑用 Navicat 执行以下 SQL-- 允许root用户从任意局域网IP访问%表示所有IPCREATE USER IF NOT EXISTS root% IDENTIFIED BY 123456;-- 授予所有权限生产环境可限制权限测试用全开GRANT ALL PRIVILEGES ON *.* TO root%;-- 刷新权限FLUSH PRIVILEGES;-- 关键修改认证方式解决Python连接卡死ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;FLUSH PRIVILEGES;2. 开放 MySQL 3306 端口防火墙服务器端必须开放 3306 端口否则客户端连不上方法 1图形界面推荐1.按 WinR → 输入wf.msc→ 打开「高级防火墙」2.左侧「入站规则」→ 右侧「新建规则」3.选择「端口」→ 下一步4.协议选 TCP → 特定本地端口填 3306 → 下一步5.选择「允许连接」→ 下一步6.勾选「专用 / 公用 / 域」→ 下一步7.名称填「MySQL 3306」→ 完成。方法 2命令行管理员模式New-NetFirewallRule -DisplayName MySQL 3306 -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow3. 关闭 MySQL DNS 反向解析可选解决卡死这是AI给的方法这一步我没有操作也实现了功能。如果客户端连接仍卡死修改 MySQL 配置文件my.ini通常在ProgramData\MySQL\MySQL Server 8.0\# 新增一行关闭DNS反向解析skip_name_resolve保存后重启 MySQL 服务服务面板找到 MySQL → 重启。六、避坑指南核心重点全程踩了 8 个坑整理成「问题 - 原因 - 解决方案」直接对照解决重点是第四点mysql.connector 不兼容 MySQL 8.0 认证方式或 DNS 反向解析超时改用 PyMySQL问题现象根本原因解决方案报错no such table: upload_data表未创建或数据库名错误1. 执行建表 SQL2. 确认代码中database参数正确报错NameError: name conn is not defined连接失败时conn未初始化就关闭提前定义conn None关闭前判断if conn is not None写入成功但查询为空1. 数据库名错误如误用系统库mysql2. 写入未 commit1. 确认代码中database是自己建的库2. 插入后执行conn.commit()客户端 Navicat 能连Python 卡死不报错mysql.connector 不兼容 MySQL 8.0 认证方式或 DNS 反向解析超时1. 改用 PyMySQL2. 执行ALTER USER修改认证方式3. 关闭 DNS 反向解析报错module pymysql has no attribute connect文件名或目录下有pymysql.py覆盖了真实库重命名文件如改为mysql_query.py删除__pycache__文件夹局域网连接失败TimeoutError服务器防火墙未开放 3306 端口按步骤开放 3306 端口或临时关闭防火墙测试报错Access denied for user rootxxx.xxx.xxx.xxx未授权局域网用户访问执行授权 SQLCREATE USERGRANT补全程序提取年 / 月 / 日错误时间格式长度不足 8 位代码中添加if len(time_full) 8判断确保格式正确七、最终效果服务器端运行「上传程序」「补全程序」每 3 秒生成一条时间数据自动补全年 / 月 / 日日志实时输出局域网客户端运行「查询程序」秒连数据库显示所有数据无卡死、无报错、数据实时同步。八、扩展建议生产环境优化给 MySQL 用户分配最小权限不用ALL PRIVILEGES定期备份数据库避免数据丢失限制上传频率根据需求调整sleep时间功能扩展增加数据导出 Excel 功能加入异常邮件提醒打包成 exe 文件用 PyInstaller双击运行替代方案若不想用 MySQL可选择 PostgreSQL更稳定若需跨互联网访问可配置端口映射 动态域名。总结这套方案的核心是「放弃文件型数据库选择 C/S 架构的 MySQL」从根源解决局域网数据同步的稳定性问题。全程最关键的是「MySQL 局域网授权 防火墙端口开放 PyMySQL 驱动选择」避开这三个坑基本就能一次成功。所有代码都经过实测直接复制修改配置即可运行希望能帮大家少走弯路如果遇到其他问题欢迎在评论区交流注文档部分内容可能由 AI 生成