1+ """Database seeding runner."""
2+
3+ import logging
4+ import os
5+ import sys
6+ from sqlalchemy import create_engine
7+ from sqlalchemy .orm import sessionmaker
8+ from dotenv import load_dotenv
9+
10+ from app .utilities .constants import LOGGER_NAME
11+
12+ # Import all seed functions
13+ from .roles import seed_roles
14+ from .treatments import seed_treatments
15+ from .experiences import seed_experiences
16+ from .qualities import seed_qualities
17+ from .forms import seed_forms
18+
19+ # Load environment variables
20+ load_dotenv ()
21+
22+ log = logging .getLogger (LOGGER_NAME ("seeds" ))
23+
24+
25+ def get_database_session ():
26+ """Create a database session for seeding."""
27+ database_url = os .getenv ("POSTGRES_DATABASE_URL" )
28+ if not database_url :
29+ raise ValueError ("POSTGRES_DATABASE_URL environment variable is required" )
30+
31+ engine = create_engine (database_url )
32+ SessionLocal = sessionmaker (bind = engine )
33+ return SessionLocal ()
34+
35+
36+ def seed_database (verbose : bool = True ) -> None :
37+ """
38+ Run all database seeding functions.
39+
40+ Args:
41+ verbose: Whether to print detailed output
42+ """
43+ if verbose :
44+ print ("🌱 Starting database seeding..." )
45+
46+ session = get_database_session ()
47+
48+ try :
49+ # Run all seed functions in dependency order
50+ seed_functions = [
51+ ("Roles" , seed_roles ),
52+ ("Treatments" , seed_treatments ),
53+ ("Experiences" , seed_experiences ),
54+ ("Qualities" , seed_qualities ),
55+ ("Forms" , seed_forms ),
56+ ]
57+
58+ for name , seed_func in seed_functions :
59+ if verbose :
60+ print (f"\n 📦 Seeding { name } ..." )
61+ try :
62+ seed_func (session )
63+ if verbose :
64+ print (f"✅ { name } seeded successfully" )
65+ except Exception as e :
66+ print (f"❌ Error seeding { name } : { str (e )} " )
67+ log .error (f"Error seeding { name } : { str (e )} " )
68+ raise
69+
70+ if verbose :
71+ print ("\n 🎉 Database seeding completed successfully!" )
72+
73+ except Exception as e :
74+ session .rollback ()
75+ if verbose :
76+ print (f"\n ❌ Database seeding failed: { str (e )} " )
77+ raise
78+ finally :
79+ session .close ()
80+
81+
82+ def main ():
83+ """CLI entry point for database seeding."""
84+ import argparse
85+
86+ parser = argparse .ArgumentParser (description = "Seed the LLSC database with reference data" )
87+ parser .add_argument ("--quiet" , "-q" , action = "store_true" , help = "Suppress output" )
88+ parser .add_argument ("--env" , help = "Environment (currently unused but for future extension)" )
89+
90+ args = parser .parse_args ()
91+
92+ try :
93+ seed_database (verbose = not args .quiet )
94+ sys .exit (0 )
95+ except Exception as e :
96+ print (f"Seeding failed: { str (e )} " )
97+ sys .exit (1 )
98+
99+
100+ if __name__ == "__main__" :
101+ main ()
0 commit comments