1+ #!/usr/bin/env python3
2+ """
3+ Database initialization script for Subscription Tracker
4+ Ensures database is created with proper permissions and structure
5+ """
6+
7+ import os
8+ import sys
9+ import stat
10+ from pathlib import Path
11+
12+ # Add the app directory to Python path
13+ sys .path .insert (0 , '/app' )
14+
15+ def check_database_permissions ():
16+ """Check and fix database file permissions"""
17+ instance_dir = Path ('/app/instance' )
18+ db_file = instance_dir / 'subscriptions.db'
19+
20+ print (f"Checking database permissions..." )
21+ print (f"Instance directory: { instance_dir } " )
22+ print (f"Database file: { db_file } " )
23+
24+ # Check if instance directory exists and is writable
25+ if not instance_dir .exists ():
26+ print (f"ERROR: Instance directory { instance_dir } does not exist!" )
27+ return False
28+
29+ if not os .access (instance_dir , os .W_OK ):
30+ print (f"ERROR: Instance directory { instance_dir } is not writable!" )
31+ print (f"Current permissions: { oct (instance_dir .stat ().st_mode )[- 3 :]} " )
32+ print (f"Owner: { instance_dir .stat ().st_uid } :{ instance_dir .stat ().st_gid } " )
33+ print (f"Current user: { os .getuid ()} :{ os .getgid ()} " )
34+ return False
35+
36+ # Check database file if it exists
37+ if db_file .exists ():
38+ if not os .access (db_file , os .W_OK ):
39+ print (f"ERROR: Database file { db_file } is not writable!" )
40+ print (f"Current permissions: { oct (db_file .stat ().st_mode )[- 3 :]} " )
41+ print (f"Owner: { db_file .stat ().st_uid } :{ db_file .stat ().st_gid } " )
42+ return False
43+ else :
44+ print (f"Database file exists and is writable" )
45+ else :
46+ print (f"Database file does not exist yet (will be created)" )
47+
48+ print ("Database permissions check passed!" )
49+ return True
50+
51+ def initialize_database ():
52+ """Initialize the database with proper Flask app context"""
53+ try :
54+ from app import create_app , db
55+
56+ # Create Flask app
57+ app = create_app ()
58+
59+ with app .app_context ():
60+ print ("Creating database tables..." )
61+
62+ # Create all tables
63+ db .create_all ()
64+
65+ # Verify tables were created
66+ from sqlalchemy import inspect
67+ inspector = inspect (db .engine )
68+ tables = inspector .get_table_names ()
69+
70+ print (f"Created { len (tables )} tables: { ', ' .join (tables )} " )
71+
72+ # Test database write capability
73+ print ("Testing database write capability..." )
74+ result = db .engine .execute (db .text ("SELECT 1 as test" ))
75+ test_result = result .fetchone ()
76+ print (f"Database connection test: { 'PASSED' if test_result else 'FAILED' } " )
77+
78+ return True
79+
80+ except Exception as e :
81+ print (f"ERROR: Failed to initialize database: { e } " )
82+ import traceback
83+ traceback .print_exc ()
84+ return False
85+
86+ def main ():
87+ """Main initialization function"""
88+ print ("=" * 50 )
89+ print ("Database Initialization Script" )
90+ print ("=" * 50 )
91+
92+ # Check permissions first
93+ if not check_database_permissions ():
94+ print ("Permission check failed!" )
95+ sys .exit (1 )
96+
97+ # Initialize database
98+ if not initialize_database ():
99+ print ("Database initialization failed!" )
100+ sys .exit (1 )
101+
102+ print ("=" * 50 )
103+ print ("Database initialization completed successfully!" )
104+ print ("=" * 50 )
105+
106+ if __name__ == '__main__' :
107+ main ()
0 commit comments