This commit is contained in:
rjb
2026-03-07 10:29:17 +08:00
parent f9df05470a
commit a789321005
13 changed files with 386 additions and 38 deletions

View File

@@ -0,0 +1,84 @@
#!/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()