import os from sqlalchemy import create_engine # 延迟创建 Doris 引擎,避免在导入时卡住 LOCAL_DB_URL = "mysql+pymysql://root:DsideaL147258369@192.168.10.250:9030/yltcharge?charset=utf8mb4" 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 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(开发环境) DB_TYPE = os.environ.get('DB_TYPE', 'sqlite').lower() 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