85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
|
|
#!/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()
|