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

