55 lines
1.7 KiB
Python
55 lines
1.7 KiB
Python
from sqlalchemy import text
|
|
from sqlalchemy.orm import Session
|
|
import logging
|
|
|
|
from app.db.base import Base
|
|
from app.db.engine import engine
|
|
from app.models.user import User, Role # Import models to ensure they're registered
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def init_db() -> None:
|
|
"""Initialize database schemas and tables"""
|
|
with engine.begin() as conn:
|
|
# Create schemas
|
|
conn.execute(text("CREATE SCHEMA IF NOT EXISTS fastapi"))
|
|
conn.execute(text("CREATE SCHEMA IF NOT EXISTS operationbi"))
|
|
conn.execute(text("CREATE SCHEMA IF NOT EXISTS rawdata"))
|
|
|
|
# Create all tables
|
|
Base.metadata.create_all(bind=conn)
|
|
logger.info("Database schemas and tables created")
|
|
|
|
# Seed default roles
|
|
seed_roles()
|
|
|
|
|
|
def seed_roles() -> None:
|
|
"""Seed default roles if they don't exist"""
|
|
from app.db.session import SessionLocal
|
|
|
|
db = SessionLocal()
|
|
try:
|
|
roles_data = [
|
|
{"name": "admin", "description": "Full system access - can manage users and access all features"},
|
|
{"name": "operation", "description": "Data management access - can upload and manage data"}
|
|
]
|
|
|
|
for role_data in roles_data:
|
|
existing = db.query(Role).filter(Role.name == role_data["name"]).first()
|
|
if not existing:
|
|
role = Role(**role_data)
|
|
db.add(role)
|
|
logger.info(f"Created role: {role_data['name']}")
|
|
else:
|
|
logger.info(f"Role already exists: {role_data['name']}")
|
|
|
|
db.commit()
|
|
logger.info("Role seeding completed")
|
|
except Exception as e:
|
|
logger.error(f"Error seeding roles: {e}")
|
|
db.rollback()
|
|
finally:
|
|
db.close()
|