#!/usr/bin/env python3 """ 创建项目所需 MySQL 数据库(liaotian_db)。 从环境变量 DATABASE_URL 或下方默认值读取连接信息,连接后执行 CREATE DATABASE。 用法: cd backend && python scripts/create_database.py 或指定: export DATABASE_URL='mysql+pymysql://user:pass@host:port/liaotian_db?charset=utf8mb4' python scripts/create_database.py """ import os import re import sys # 与 app/config.py 中默认一致,不导入 app 以免依赖 Flask 等 DEFAULT_DATABASE_URL = ( "mysql+pymysql://root:!Rjb12191@" "gz-cynosdbmysql-grp-d26pzce5.sql.tencentcdb.com:24936/" "liaotian_db?charset=utf8mb4" ) def parse_database_url(url): """从 DATABASE_URL 解析 host, port, user, password, database。""" # mysql+pymysql://user:password@host:port/database?query m = re.match( r"mysql\+pymysql://([^:]+):([^@]+)@([^/:]+):(\d+)/([^?]+)", url.strip(), ) if not m: raise ValueError("DATABASE_URL 格式应为: mysql+pymysql://user:pass@host:port/dbname?charset=utf8mb4") user, password, host, port, database = m.groups() import urllib.parse password = urllib.parse.unquote(password) return { "host": host, "port": int(port), "user": user, "password": password, "database": database.strip("/"), } def main(): url = os.getenv("DATABASE_URL", DEFAULT_DATABASE_URL) try: params = parse_database_url(url) except Exception as e: print("解析 DATABASE_URL 失败:", e) sys.exit(1) db_name = params["database"] print(f"连接 {params['host']}:{params['port']} (用户 {params['user']}),创建数据库: {db_name}") try: import pymysql except ImportError: print("请先安装: pip install pymysql") sys.exit(1) # 连接时不指定 database,才能执行 CREATE DATABASE conn = pymysql.connect( host=params["host"], port=params["port"], user=params["user"], password=params["password"], charset="utf8mb4", ) try: with conn.cursor() as cur: cur.execute( "CREATE DATABASE IF NOT EXISTS `%s` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" % db_name ) conn.commit() print(f"数据库 {db_name} 已存在或已创建成功。") except Exception as e: print("创建失败:", e) sys.exit(1) finally: conn.close() if __name__ == "__main__": main()