SQLAlchemy连接mysql提示pymysql.err.OperationalError: (2003, “Can‘t connect to My问题的解决记录

1. 问题描述

sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on 'root@localhost' ([Errno 11003] getaddrinfo failed)")

2.问题分析 

1.数据库配置使用navcat工具可以正常连接

2.java 项目配置地址也可以正常访问

 3.问题缘由

是因为设置密码中含有"@"关键字符,导致pymysql根据"@"分割混淆,不知道该用哪个分割

例如:

密码是:pass@#

config 配置是:

"mysql+pymysql://{username}:{password}@{host]}:{port}/{database}?charset=utf8mb4"

这样password 和 路径中的@就会重复,导致解析失败,最终导致连接失败

4. 解决方式

from urllib import parse
password = 'pass@#'
pwd = parse.quote_plus(password) 

"mysql+pymysql://{username}:{pwd }@{host]}:{port}/{database}?charset=utf8mb4"

### 解决 sqlalchemy pymysql OperationalError 2003 Can't connect to MySQL server on '192.168.0.55' timed out 当使用 SQLAlchemy 连接 MySQL 服务器时,出现 `OperationalError: (pymysql.err.OperationalError) (2003, "Can't connect to MySQL server on '192.168.0.55' (timed out)")` 错误时,通常是由于网络连接问题数据库配置不当或连接池设置不合理等原因导致的。以下是解决问题的几种方法: #### 1. 检查网络连接 确保客户端能够通过网络访问 MySQL 服务器。可以通过 `ping` 或 `telnet` 命令测试网络连通性: ```bash ping 192.168.0.55 telnet 192.168.0.55 3306 ``` 如果无法通过 `telnet` 连接,可能是防火墙或 MySQL 服务器的端口未开放。需要检查服务器的防火墙设置,确保 3306 端口是开放的,并且 MySQL 服务器允许来自客户端的连接。这可以通过修改 MySQL 的配置文件 `my.cnf` 或 `my.ini` 中的 `bind-address` 设置来实现: ```ini [mysqld] bind-address = 0.0.0.0 ``` 此外,还需要确保 MySQL 用户权限允许从远程主机连接。例如,创建一个允许从任意主机连接的用户: ```sql CREATE USER 'remote_user'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'remote_user'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES; ``` #### 2. 检查 MySQL 服务状态 确认 MySQL 服务正在运行。可以通过以下命令检查 MySQL 服务的状态: ```bash systemctl status mysql ``` 如果服务未运行,启动 MySQL 服务: ```bash systemctl start mysql ``` #### 3. 调整连接池配置 如果使用的是 Flask-SQLAlchemy,可以通过调整连接池的配置来避免因连接超时导致的问题。`SQLALCHEMY_POOL_RECYCLE` 参数用于设置连接池中连接的回收时间,建议将其设置为小于 MySQL 的 `wait_timeout` 值,以避免连接超时: ```python app.config["SQLALCHEMY_POOL_RECYCLE"] = 800 ``` 此外,还可以设置连接池的大小,以确保在高并发情况下有足够的连接可用: ```python app.config["SQLALCHEMY_POOL_SIZE"] = 10 ``` #### 4. 修改 MySQL 的超时设置 如果 MySQL 的 `wait_timeout` 设置过短,可能会导致连接在空闲一段时间后被断开。可以通过修改 MySQL 的配置文件来延长 `wait_timeout` 的值: ```ini [mysqld] wait_timeout = 28800 interactive_timeout = 28800 ``` 修改完配置文件后,重启 MySQL 服务以使更改生效: ```bash systemctl restart mysql ``` #### 5. 使用正确的连接字符串 确保连接字符串中的参数正确无误。以下是一个示例连接字符串: ```python SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Password123$@192.168.0.55:3306/your_database?charset=utf8" ``` 请确保用户名、密码、主机地址和数据库名称均正确无误。 #### 6. 检查 DNS 解析 如果 MySQL 服务器的 IP 地址是通过域名解析得到的,可能需要检查 DNS 解析是否正常工作。可以通过 `nslookup` 或 `dig` 命令来验证域名解析是否正确。 #### 7. 检查 SSL 配置 如果 MySQL 服务器启用了 SSL 加密连接,而客户端未正确配置 SSL 证书,也可能导致连接失败。可以通过在连接字符串中添加 `ssl={"ssl_mode": "DISABLED"}` 参数来禁用 SSL: ```python SQLALCHEMY_DATABASE_URI = "mysql+pymysql://root:Password123$@192.168.0.55:3306/your_database?charset=utf8&ssl={"ssl_mode": "DISABLED"}" ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值