2026-05-29 10:28:07 +08:00
|
|
|
|
import os
|
|
|
|
|
|
from sqlalchemy import create_engine
|
|
|
|
|
|
|
2026-05-29 10:40:41 +08:00
|
|
|
|
# 延迟创建 Doris 引擎,避免在导入时卡住
|
2026-05-29 10:28:07 +08:00
|
|
|
|
LOCAL_DB_URL = "mysql+pymysql://root:DsideaL147258369@192.168.10.250:9030/yltcharge?charset=utf8mb4"
|
2026-05-29 10:40:41 +08:00
|
|
|
|
write_engine = None
|
|
|
|
|
|
local_engine = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_write_engine():
|
|
|
|
|
|
"""获取 write_engine,如果不存在则创建(延迟初始化)"""
|
|
|
|
|
|
global write_engine, local_engine
|
|
|
|
|
|
if write_engine is None:
|
|
|
|
|
|
try:
|
|
|
|
|
|
write_engine = create_engine(
|
|
|
|
|
|
LOCAL_DB_URL,
|
|
|
|
|
|
pool_recycle=3600,
|
|
|
|
|
|
pool_pre_ping=True,
|
|
|
|
|
|
connect_args={'connect_timeout': 2, 'read_timeout': 5, 'write_timeout': 5}
|
|
|
|
|
|
)
|
|
|
|
|
|
local_engine = write_engine
|
|
|
|
|
|
except Exception:
|
|
|
|
|
|
write_engine = None
|
|
|
|
|
|
local_engine = None
|
|
|
|
|
|
return write_engine
|
2026-05-29 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Config:
|
|
|
|
|
|
"""应用配置"""
|
|
|
|
|
|
SECRET_KEY = os.environ.get('SECRET_KEY', 'student-course-mgmt-secret-key-2024')
|
|
|
|
|
|
|
|
|
|
|
|
# 数据库配置:支持 MySQL / Aliyun RDS MySQL / SQLite
|
|
|
|
|
|
#
|
|
|
|
|
|
# 方式1 - 自建MySQL:
|
|
|
|
|
|
# DB_TYPE=mysql, MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DB
|
|
|
|
|
|
#
|
|
|
|
|
|
# 方式2 - 阿里云RDS MySQL:
|
|
|
|
|
|
# DB_TYPE=aliyun_mysql
|
|
|
|
|
|
# ALIYUN_MYSQL_HOST (必填,RDS内网/外网地址,如 rm-xxxxx.mysql.rds.aliyuncs.com)
|
|
|
|
|
|
# ALIYUN_MYSQL_PORT (默认3306)
|
|
|
|
|
|
# ALIYUN_MYSQL_USER (默认root)
|
|
|
|
|
|
# ALIYUN_MYSQL_PASSWORD (必填)
|
|
|
|
|
|
# ALIYUN_MYSQL_DB (默认student_course)
|
|
|
|
|
|
# ALIYUN_MYSQL_SSL (可选,设为1启用SSL连接)
|
|
|
|
|
|
#
|
|
|
|
|
|
# 不设置则默认使用 SQLite(开发环境)
|
2026-05-29 10:40:41 +08:00
|
|
|
|
DB_TYPE = os.environ.get('DB_TYPE', 'sqlite').lower()
|
2026-05-29 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
if DB_TYPE == 'mysql':
|
|
|
|
|
|
SQLALCHEMY_DATABASE_URI = os.environ.get('SQLALCHEMY_DATABASE_URI', LOCAL_DB_URL)
|
|
|
|
|
|
SQLALCHEMY_ENGINE_OPTIONS = {
|
|
|
|
|
|
'pool_recycle': 3600,
|
|
|
|
|
|
'pool_pre_ping': True,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
elif DB_TYPE == 'aliyun_mysql':
|
|
|
|
|
|
ALIYUN_MYSQL_HOST = os.environ.get('ALIYUN_MYSQL_HOST', 'rm-xxxxx.mysql.rds.aliyuncs.com')
|
|
|
|
|
|
ALIYUN_MYSQL_PORT = os.environ.get('ALIYUN_MYSQL_PORT', '3306')
|
|
|
|
|
|
ALIYUN_MYSQL_USER = os.environ.get('ALIYUN_MYSQL_USER', 'root')
|
|
|
|
|
|
ALIYUN_MYSQL_PASSWORD = os.environ.get('ALIYUN_MYSQL_PASSWORD', '')
|
|
|
|
|
|
ALIYUN_MYSQL_DB = os.environ.get('ALIYUN_MYSQL_DB', 'student_course')
|
|
|
|
|
|
ALIYUN_MYSQL_SSL = os.environ.get('ALIYUN_MYSQL_SSL', '0')
|
|
|
|
|
|
|
|
|
|
|
|
# 构建连接URI,阿里云RDS强制utf8mb4
|
|
|
|
|
|
_ssl_param = '&ssl=true&ssl_ca=/etc/ssl/certs/ca-certificates.crt' if ALIYUN_MYSQL_SSL == '1' else ''
|
|
|
|
|
|
SQLALCHEMY_DATABASE_URI = (
|
|
|
|
|
|
f'mysql+pymysql://{ALIYUN_MYSQL_USER}:{ALIYUN_MYSQL_PASSWORD}'
|
|
|
|
|
|
f'@{ALIYUN_MYSQL_HOST}:{ALIYUN_MYSQL_PORT}/{ALIYUN_MYSQL_DB}'
|
|
|
|
|
|
f'?charset=utf8mb4{_ssl_param}'
|
|
|
|
|
|
)
|
|
|
|
|
|
# 阿里云RDS推荐连接池参数:长连接 + 自动重连 + 超时回收
|
|
|
|
|
|
SQLALCHEMY_ENGINE_OPTIONS = {
|
|
|
|
|
|
'pool_pre_ping': True, # 每次取连接前检测存活,避免RDS主动断连后报错
|
|
|
|
|
|
'pool_recycle': 1800, # RDS默认wait_timeout=28800,设1800秒回收更安全
|
|
|
|
|
|
'pool_size': 10, # 常驻连接数
|
|
|
|
|
|
'max_overflow': 20, # 峰值额外连接
|
|
|
|
|
|
'pool_timeout': 30, # 获取连接超时(秒)
|
|
|
|
|
|
'connect_args': {
|
|
|
|
|
|
'connect_timeout': 10, # 建立TCP连接超时(秒)
|
|
|
|
|
|
'read_timeout': 30, # 读超时(秒)
|
|
|
|
|
|
'write_timeout': 30, # 写超时(秒)
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
SQLALCHEMY_DATABASE_URI = 'sqlite:///student_course.db'
|
|
|
|
|
|
SQLALCHEMY_ENGINE_OPTIONS = {
|
|
|
|
|
|
'pool_pre_ping': True,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|