树莓派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
相关产品推荐
相关产品推荐

