You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派3上Python MySQLdb连接外部数据库后脚本终止运行

树莓派3 Python脚本连接MySQL卡住?看这几个排查方法

嘿,看你的问题,脚本在MySQLdb.connect()那一步直接卡住了对吧?print("test")能正常输出,到连接数据库之后的test2就没影了,说明连接请求要么一直没得到响应,要么出了错但没被捕获到。给你几个实用的排查和解决方向:

1. 先加异常捕获+超时,搞清楚到底错在哪

你现在的代码没有任何错误处理,就算连接失败也只会默默卡住。先把连接部分包进try-except,再加个超时时间,这样能直接看到错误信息,不会无限等下去:

import MySQLdb
from MySQLdb import OperationalError

HOST = "host"
PORT = 3306
USER = "user"
PASS = "pass"
DATABASE = "databasename"

print("test")
try:
    # 加connect_timeout,10秒连不上就报错
    db = MySQLdb.connect(
        host=HOST,
        port=PORT,
        user=USER,
        passwd=PASS,
        db=DATABASE,
        connect_timeout=10
    )
    print("test2")
    cursor = db.cursor()
    cursor.execute("SELECT * FROM Persoon")
    data = cursor.fetchone()
    print("database version :%s"% data)
    db.close()
except OperationalError as e:
    print(f"连接出错啦: {e}")

跑这个修改后的脚本,就能看到具体是网络问题、权限问题还是地址写错了。

2. 先排查网络和数据库的远程访问权限

这是最常见的原因:

  • 先测树莓派能不能连到数据库主机:在树莓派终端里敲ping <你的HOST地址>,如果ping不通,那就是网络问题——要么数据库不在同一局域网,要么防火墙把3306端口挡住了。
  • 检查数据库用户的远程访问权限:默认MySQL不让远程连接,你得确认user这个账号允许从树莓派的IP访问。在数据库服务器上执行这条SQL:
    SELECT host, user FROM mysql.user WHERE user = 'user';
    
    如果结果里host是localhost或者某个特定IP,不是%(允许所有IP),就得改权限:
    GRANT ALL PRIVILEGES ON databasename.* TO 'user'@'%' IDENTIFIED BY 'pass';
    FLUSH PRIVILEGES;
    
    怕不安全的话,把%换成树莓派的具体IP就行。
  • 检查防火墙:数据库服务器的防火墙要开放3306端口,树莓派这边的防火墙也要允许出站连接到3306端口。

3. 确认MySQLdb库的兼容性

看你最后print "database version :%s"% data是Python2的语法,树莓派3如果用的是Python2,要确保装的是对应版本的MySQLdb:

sudo apt-get install python-mysqldb

如果是Python3的话,MySQLdb已经不维护了,得装mysqlclient替代:

sudo apt-get install python3-dev default-libmysqlclient-dev
pip3 install mysqlclient

4. 换个更现代的库试试(比如pymysql)

MySQLdb有点老旧,pymysql是纯Python写的,兼容性更好,用法几乎一样,你可以试试:

import pymysql

HOST = "host"
PORT = 3306
USER = "user"
PASS = "pass"
DATABASE = "databasename"

print("test")
try:
    db = pymysql.connect(
        host=HOST,
        port=PORT,
        user=USER,
        password=PASS,
        database=DATABASE,
        connect_timeout=10
    )
    print("test2")
    cursor = db.cursor()
    cursor.execute("SELECT * FROM Persoon")
    data = cursor.fetchone()
    print("database version :%s"% data)
    db.close()
except pymysql.MySQLError as e:
    print(f"连接出错: {e}")

先装pymysql:pip install pymysql(Python2)或者pip3 install pymysql(Python3)


内容的提问来源于stack exchange,提问作者Wesley van Straalen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:06:38