fastapi-demo/database_manager.py

140 lines
4.0 KiB
Python
Raw Permalink Normal View History

"""
数据库管理脚本
用于初始化数据库运行迁移插入测试数据等
"""
import os
import sys
import asyncio
from sqlalchemy import create_engine, text
from app.core.config import settings
from app.database.models import Base
def create_database():
"""创建数据库(如果不存在)"""
# 连接到MySQL服务器不指定数据库
server_url = f"mysql+pymysql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/"
engine = create_engine(server_url)
with engine.connect() as conn:
# 创建数据库
conn.execute(text(f"CREATE DATABASE IF NOT EXISTS `{settings.DB_NAME}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"))
print(f"✅ 数据库 '{settings.DB_NAME}' 创建成功")
def create_tables():
"""创建数据库表"""
engine = create_engine(settings.DATABASE_URL)
Base.metadata.create_all(bind=engine)
print("✅ 数据库表创建成功")
def run_sql_file(file_path):
"""运行SQL文件"""
if not os.path.exists(file_path):
print(f"❌ SQL文件不存在: {file_path}")
return
engine = create_engine(settings.DATABASE_URL)
with open(file_path, 'r', encoding='utf-8') as f:
sql_content = f.read()
with engine.connect() as conn:
# 分割SQL语句并执行
statements = [stmt.strip() for stmt in sql_content.split(';') if stmt.strip()]
for statement in statements:
if statement:
conn.execute(text(statement))
conn.commit()
print(f"✅ SQL文件执行成功: {file_path}")
def init_database():
"""初始化数据库"""
print("🚀 开始初始化数据库...")
# 1. 创建数据库
create_database()
# 2. 创建表
create_tables()
# 3. 插入示例数据
sample_data_file = "sql/seeds/sample_data.sql"
if os.path.exists(sample_data_file):
run_sql_file(sample_data_file)
print("🎉 数据库初始化完成!")
def reset_database():
"""重置数据库"""
print("⚠️ 重置数据库...")
# 删除并重新创建数据库
server_url = f"mysql+pymysql://{settings.DB_USER}:{settings.DB_PASSWORD}@{settings.DB_HOST}:{settings.DB_PORT}/"
engine = create_engine(server_url)
with engine.connect() as conn:
conn.execute(text(f"DROP DATABASE IF EXISTS `{settings.DB_NAME}`"))
print(f"🗑️ 数据库 '{settings.DB_NAME}' 已删除")
# 重新初始化
init_database()
def show_help():
"""显示帮助信息"""
print("""
数据库管理脚本使用说明:
python database_manager.py init - 初始化数据库创建数据库和表
python database_manager.py reset - 重置数据库删除并重新创建
python database_manager.py create-db - 仅创建数据库
python database_manager.py create-tables - 仅创建表
python database_manager.py seed - 仅插入示例数据
python database_manager.py help - 显示此帮助信息
环境变量配置:
- DB_HOST: 数据库主机 (默认: localhost)
- DB_PORT: 数据库端口 (默认: 3306)
- DB_USER: 数据库用户名 (默认: root)
- DB_PASSWORD: 数据库密码 (默认: )
- DB_NAME: 数据库名称 (默认: fastapi_demo)
""")
def main():
"""主函数"""
if len(sys.argv) < 2:
show_help()
return
command = sys.argv[1].lower()
try:
if command == "init":
init_database()
elif command == "reset":
reset_database()
elif command == "create-db":
create_database()
elif command == "create-tables":
create_tables()
elif command == "seed":
run_sql_file("sql/seeds/sample_data.sql")
elif command == "help":
show_help()
else:
print(f"❌ 未知命令: {command}")
show_help()
except Exception as e:
print(f"❌ 执行失败: {str(e)}")
sys.exit(1)
if __name__ == "__main__":
main()