PyScript网页连接MySQL:包安装失败与连接异常问题求助
PyScript连接MySQL数据库的问题与解决方案
问题描述
1. 包安装失败报错
初始使用mysql.connector时触发PY1001错误:无法找到纯Python 3 Wheel包,尝试7年前的pip install --allow-external mysql-connector-python mysql-connector-python命令,因依赖旧版pip(8.x)无法生效。本地已安装pymysql和mysql-connector-python,相关环境信息如下:
[root@localhost ~]# pip show pymysql Name: PyMySQL Version: 1.0.2 Summary: Pure Python MySQL Driver Home-page: https://github.com/PyMySQL/PyMySQL/ Author: yutaka.matsubara Author-email: yutaka.matsubara@gmail.com License: "MIT" Location: /usr/local/lib/python3.6/site-packages Requires: Required-by: [root@localhost ~]# pip show mysql-connector-python Name: mysql-connector-python Version: 8.0.31 Summary: MySQL driver written in Python Home-page: http://dev.mysql.com/doc/connector-python/en/index.html Author: Oracle and/or its affiliates Author-email: License: GNU GPLv2 (with FOSS License Exception) Location: /usr/local/lib/python3.6/site-packages Requires: protobuf Required-by: [root@localhost ~]# pip list Package Version ---------------------- ------- mysql-connector 2.2.9 mysql-connector-python 8.0.31 pip 21.3.1 protobuf 3.19.6 PyMySQL 1.0.2 setuptools 59.6.0
2. 连接数据库报错
解决包安装问题后,出现连接错误,报错日志:
Traceback (most recent call last): File "/lib/python3.10/site-packages/mysql/connector/network.py", line 567, in open_connection self.sock.connect(sockaddr) BlockingIOError: [Errno 26] Operation in progress The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/lib/python3.10/site-packages/_pyodide/_base.py", line 435, in eval_code .run(globals, locals) File "/lib/python3.10/site-packages/_pyodide/_base.py", line 304, in run coroutine = eval(self.code, globals, locals) File "<exec>", line 3, in <module> File "/lib/python3.10/site-packages/mysql/connector/pooling.py", line 287, in connect return MySQLConnection(*args, **kwargs) File "/lib/python3.10/site-packages/mysql/connector/connection.py", line 137, in __init__ self.connect(**kwargs) File "/lib/python3.10/site-packages/mysql/connector/abstracts.py", line 1108, in connect self._open_connection() File "/lib/python3.10/site-packages/mysql/connector/connection.py", line 533, in _open_connection self._socket.open_connection() File "/lib/python3.10/site-packages/mysql/connector/network.py", line 569, in open_connection raise InterfaceError( mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on '196.168.100.141:3306' (26 Operation in progress)
本地普通Python脚本使用相同连接参数可正常连接,但PyScript中无法连接,原PyScript代码:
<py-script> import mysql.connector mydb = mysql.connector.connect( host="196.168.100.141", user="root", password="password123", database="database_db", auth_plugin='mysql_native_password' ) mycursor = mydb.cursor() mycursor.execute("SELECT row_01 FROM database") myresult = mycursor.fetchall() list_01 = [] for row in myresult: temp_val = row[0] list_01.append(temp_val) </py-script>
解决方案
针对包安装失败的问题
PyScript基于Pyodide运行,仅支持纯Python包或提供Pyodide兼容Wheel的包。mysql.connector官方包包含C扩展,无法直接在Pyodide中运行;而PyMySQL是纯Python实现的MySQL驱动,完全兼容Pyodide,直接改用PyMySQL即可。
在HTML中添加包配置:
<py-config> packages = ["pymysql"] </py-config>
针对连接报错的问题
PyScript运行在浏览器环境中,存在两个核心限制导致直接连接MySQL失败:
- 浏览器同源策略限制:无法直接访问局域网内的MySQL服务(MySQL本身不支持CORS配置)
- Pyodide网络限制:不支持阻塞式Socket连接,而MySQL驱动的默认连接均为阻塞式,触发
BlockingIOError
推荐方案:后端代理中转数据
不要在前端PyScript中直接连接MySQL,搭建后端接口负责数据库交互,前端通过HTTP请求获取数据。
步骤1:编写后端接口(以Flask为例)
from flask import Flask, jsonify from flask_cors import CORS import pymysql app = Flask(__name__) CORS(app) # 解决跨域问题 @app.route('/get-data') def get_data(): conn = pymysql.connect( host='196.168.100.141', user='root', password='password123', database='database_db', cursorclass=pymysql.cursors.DictCursor ) try: with conn.cursor() as cursor: cursor.execute("SELECT row_01 FROM database") results = cursor.fetchall() return jsonify([row['row_01'] for row in results]) finally: conn.close() if __name__ == '__main__': app.run(host='0.0.0.0', port=5000, debug=True)
注:需先安装依赖pip install flask flask-cors pymysql
步骤2:修改PyScript代码请求后端接口
<py-config> packages = ["requests"] </py-config> <py-script> import requests try: response = requests.get("http://你的后端IP:5000/get-data") response.raise_for_status() list_01 = response.json() # 此处可添加数据展示逻辑,比如渲染到页面 print(list_01) except Exception as e: print(f"请求失败: {e}") </py-script>
备选测试方案(不推荐生产)
若需临时测试,可尝试使用PyMySQL配合异步操作,但仅能连接公网支持HTTP隧道的MySQL服务,且可行性极低,不用于生产环境。
内容的提问来源于stack exchange,提问作者user20861658
相关产品推荐
相关产品推荐

