pymysql 使用ConfigParser 连接
时间: 2025-07-08 21:14:06 浏览: 2
<think>好的,我现在需要帮用户解决如何用ConfigParser读取int类型的配置并通过pymysql连接数据库的问题。用户之前已经得到了一些解决方案,现在需要结合新的引用信息来优化回答。首先,用户提到遇到MySQL连接超时的问题,引用[1]中建议使用连接池来管理连接,避免因为超时导致的错误。引用[2]则提到了读取配置文件连接SQL Server的例子,可能对用户有帮助,但用户现在用的是pymysql,所以需要调整。
首先,我需要回顾用户之前的回答,确保新回答保持一致。用户之前提到了三种方法:显式类型转换、使用getint()方法、自定义函数和扩展ConfigParser类。现在需要整合连接池的建议,因为用户遇到的问题可能是由于长时间不活动的连接被MySQL断开导致的。
接下来,用户的问题是如何读取int类型的配置,并连接数据库。所以,我需要强调如何正确读取端口号作为整数,同时结合连接池的使用来保持连接的活跃,避免超时错误。
我应该先确认用户是否了解连接池的概念,但根据引用[1],用户已经遇到了超时问题,所以直接推荐使用连接池是合理的。然后,分步骤说明如何配置ConfigParser读取int类型,并结合pymysql的连接池来管理连接。
需要检查用户提供的示例代码是否正确使用了getint()方法,并确保在连接参数中正确传递端口作为整数。此外,还要加入错误处理,比如捕获类型转换异常,以及配置文件中缺少必要配置项的情况。
可能还需要提到如何设置连接池的参数,比如最小和最大连接数,以及超时时间,这些也可以通过ConfigParser来配置,并同样处理类型转换的问题。例如,池的大小参数也需要是整数,所以同样需要getint()方法。
另外,用户可能在配置文件中除了端口,还有其他需要类型转换的配置项,比如连接超时时间、字符集等,但用户主要关注端口,所以重点放在端口处理上,同时简要提及其他可能的配置。
最后,确保整个解决方案结构清晰,步骤明确,代码示例正确,并且包含错误处理和最佳实践,比如使用连接池而不是全局变量,以及如何验证配置是否正确读取。</think>### 解决方案:使用`ConfigParser`读取int类型配置并通过pymysql连接数据库
#### 核心问题
1. **类型转换**:`ConfigParser`默认读取值为字符串,需将端口号`port`转为整数
2. **连接管理**:直接使用单连接可能导致MySQL因超时断开(默认`wait_timeout=28800`秒)[^1]
3. **安全性**:需验证配置项存在性及有效性
---
### 步骤说明(含连接池优化)
#### 1. 配置文件示例 `mysql_config.ini`
```ini
[mysql]
host = localhost
port = 3306 # 需转为int类型
user = root
password = your_password
database = test_db
pool_size = 5 # 连接池容量(整数)
charset = utf8mb4
```
#### 2. 读取配置并转换类型
##### 方法一:使用`getint()`直接转换
```python
import configparser
from pymysql import Connect, cursors
from pymysql.connections import Connection
from dbutils.pooled_db import PooledDB # 使用连接池[^1]
def load_db_config(config_path: str) -> dict:
"""读取配置并验证类型"""
config = configparser.ConfigParser()
config.read(config_path)
if not config.has_section('mysql'):
raise ValueError("配置文件中缺少 [mysql] 段落")
required_fields = ['host', 'port', 'user', 'password', 'database']
for field in required_fields:
if not config.has_option('mysql', field):
raise ValueError(f"缺失必要配置项: {field}")
return {
'host': config.get('mysql', 'host'),
'port': config.getint('mysql', 'port'), # 关键类型转换
'user': config.get('mysql', 'user'),
'password': config.get('mysql', 'password'),
'database': config.get('mysql', 'database'),
'charset': config.get('mysql', 'charset', fallback='utf8mb4'),
'pool_size': config.getint('mysql', 'pool_size', fallback=5) # 连接池大小
}
```
#### 3. 创建连接池[^1]
```python
def create_connection_pool(config: dict) -> PooledDB:
"""创建MySQL连接池"""
return PooledDB(
creator=Connection,
mincached=1,
maxcached=config['pool_size'],
host=config['host'],
port=config['port'], # 已转为int
user=config['user'],
password=config['password'],
database=config['database'],
charset=config['charset'],
cursorclass=cursors.DictCursor
)
```
#### 4. 使用示例
```python
# 读取配置
try:
db_config = load_db_config('mysql_config.ini')
except ValueError as e:
print(f"配置错误: {e}")
exit(1)
# 初始化连接池
pool = create_connection_pool(db_config)
# 从连接池获取连接
def execute_query(sql: str, params=None):
conn = pool.connection() # 自动管理连接生命周期
try:
with conn.cursor() as cursor:
cursor.execute(sql, params or ())
result = cursor.fetchall()
conn.commit()
return result
except Exception as e:
conn.rollback()
raise e
finally:
conn.close() # 实际将连接返回到池中
# 使用示例
results = execute_query("SELECT * FROM users WHERE age > %s", (25,))
```
---
### 关键点说明
1. **类型安全读取**:
- 使用`config.getint()`确保`port`和`pool_size`为整数
- 添加`fallback`参数处理可选配置项(如`pool_size`)
2. **连接池优势**:
- 避免`MySQL server has gone away`错误[^1]
- 自动回收空闲连接(通过`wait_timeout`配置)
- 减少重复建立连接的开销
3. **错误处理**:
- 验证必要配置项是否存在
- 使用`try-except`捕获连接异常
- 事务失败时自动回滚
---
### 扩展:配置验证函数
```python
def validate_port(port: int):
"""验证端口号有效性"""
if not (0 < port <= 65535):
raise ValueError(f"无效端口号: {port}")
return port
# 在load_db_config中添加验证
config = load_db_config('mysql_config.ini')
config['port'] = validate_port(config['port'])
```
---
### 完整流程示意图
```
配置文件 -> ConfigParser读取 -> 类型转换 -> 连接池初始化 -> 执行查询
(字符串) (int/float) (PooledDB) (自动管理连接)
```
---
### 常见问题解决
1. **端口号非整数**:
```python
# 错误示例:port = '3306abc'
try:
port = config.getint('mysql', 'port')
except ValueError:
print("端口号必须为整数")
```
2. **连接池资源释放**:
```python
# 服务关闭时关闭连接池
def shutdown_pool():
pool.close()
```
---
### 引用说明
[^1]: 连接池机制可有效避免MySQL服务端主动断开空闲连接的问题,通过复用连接减少资源消耗。
[^2]: 配置文件读取时需注意跨平台路径处理(如Windows使用`C:\`路径需转义)。
阅读全文
相关推荐















