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

Flask执行db migrate时遭遇sqlalchemy.exc.OperationalError求助

问题描述

在Mac设备上使用Flask开发Web工具,当前进行数据库迁移工作,采用MariaDB数据库。已完成数据库完整安装,通过mysql.server start成功启动数据库,也能进入数据库环境创建数据库。Flask应用通过SQLAlchemy实现与数据库的连接,执行flask run命令时应用可正常运行无报错,但执行flask db migrate命令时,出现sqlalchemy.exc.OperationalError错误,错误日志如下:

Traceback (most recent call last):
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/pymysql/connections.py", line 613, in connect
    sock = socket.create_connection(
  File "/Users/miniconda3/lib/python3.9/socket.py", line 822, in create_connection
    for res in getaddrinfo(host, port, 0, SOCK_STREAM):
  File "/Users/miniconda3/lib/python3.9/socket.py", line 953, in getaddrinfo
    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 8] 无法解析主机名或服务名,或无法识别

在处理上述异常期间,发生了另一个异常:

Traceback (most recent call last):
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/engine/base.py", line 3280, in _wrap_pool_connect
    return fn()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 310, in connect
    return _ConnectionFairy._checkout(self)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 868, in _checkout
    fairy = _ConnectionRecord.checkout(pool)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 476, in checkout
    rec = pool._do_get()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 146, in _do_get
    self._dec_overflow()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 208, in raise_
    raise exception
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/impl.py", line 143, in _do_get
    return self._create_connection()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 256, in _create_connection
    return _ConnectionRecord(self)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 371, in __init__
    self.__connect()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 666, in __connect
    pool.logger.debug("Error on connect(): %s", e)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/util/langhelpers.py", line 70, in __exit__
    compat.raise_(
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/util/compat.py", line 208, in raise_
    raise exception
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/pool/base.py", line 661, in __connect
    self.dbapi_connection = connection = pool._invoke_creator(self)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/engine/create.py", line 590, in connect
    return dialect.connect(*cargs, **cparams)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/sqlalchemy/engine/default.py", line 597, in connect
    return self.dbapi.connect(*cargs, **cparams)
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/pymysql/connections.py", line 353, in __init__
    self.connect()
  File "/Users/Desktop/blog_example/blog/lib/python3.9/site-packages/pymysql/connections.py", line 664, in connect
    raise exc
pymysql.err.OperationalError: (2003, "无法连接到位于 '123456@localhost' 的MySQL服务器 ([Errno 8] 无法解析主机名或服务名,或无法识别)")

上述异常直接导致了以下异常:

Traceback (most recent call last):
  File "/Users/Desktop/blog_example/blog/bin/flask", line 8, in <module>
    sys.exit(main())

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "无法连接到位于 '123456@localhost' 的MySQL服务器 ([Errno 8] 无法解析主机名或服务名,或无法识别)")

解决方案

核心问题定位

错误日志明确显示pymysql试图连接主机123456@localhost,这是因为数据库连接URI格式错误:将密码直接放在@符号前,缺少用户名部分,导致SQLAlchemy错误解析主机地址。

具体修复步骤

  • 修正数据库连接URI格式:
    Flask配置中的SQLALCHEMY_DATABASE_URI必须严格遵循数据库类型+驱动://用户名:密码@主机地址:端口/数据库名称的结构。针对MariaDB的正确格式示例:

    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@localhost:3306/your_database_name'
    

    替换其中的root为你的数据库用户名,123456为密码,your_database_name为你创建的数据库名称,端口默认3306可根据实际情况调整。

  • 确认配置加载一致性:
    检查FLASK_APP和FLASK_ENV环境变量,确保执行flask db migrate时使用的配置文件与flask run时一致。可以通过以下命令查看当前环境变量:

    echo $FLASK_APP
    echo $FLASK_ENV
    

    若不一致,执行对应命令设置,例如:

    export FLASK_APP=app.py
    export FLASK_ENV=development
    
  • 验证数据库连接有效性:
    用MariaDB命令行手动测试连接,确认用户名、密码、主机和数据库名正确:

    mysql -u root -p123456 -h localhost your_database_name
    

    若能成功进入数据库,则说明连接信息无误,再重新执行flask db migrate即可。


内容的提问来源于stack exchange,提问作者bioinfo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:57:20