CityTrack / Backend /database /init_db.py
synapticpush
db-init: Implement database initialization and seeding
93ed57e
import asyncio
import logging
from sqlalchemy.ext.asyncio import create_async_engine
from Backend.core.config import settings
from Backend.database.models import Base
from Backend.database.seed import seed_data
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def init_models():
"""Drops and recreates all tables, then seeds initial data."""
logger.info("Initializing database...")
database_url = settings.database_url.replace("port=6543", "port=5432").replace("postgresql://", "postgresql+asyncpg://")
engine = create_async_engine(
database_url,
echo=True,
connect_args={
"statement_cache_size": 0,
"prepared_statement_cache_size": 0,
}
)
async with engine.begin() as conn:
logger.info("Dropping existing tables...")
logger.info("Creating new tables...")
await conn.run_sync(Base.metadata.create_all)
logger.info("Schema initialized. Seeding data...")
try:
await seed_data(engine)
logger.info("Seeding completed successfully!")
except Exception as e:
logger.error(f"Seeding failed: {e}")
await engine.dispose()
logger.info("Database initialization finished.")
if __name__ == "__main__":
asyncio.run(init_models())