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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:20:23