81 lines
2.4 KiB
Python
Executable File
81 lines
2.4 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
|
|
import os
|
|
import sqlite3
|
|
from datetime import datetime
|
|
import sys
|
|
import importlib.util
|
|
|
|
# Add the parent directory to path so we can import the app
|
|
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
sys.path.insert(0, parent_dir)
|
|
|
|
from app import app, db_path, create_default_categories
|
|
from models import db, User, Category
|
|
|
|
def rebuild_database():
|
|
"""Completely rebuilds the database by dropping and recreating all tables."""
|
|
with app.app_context():
|
|
print(f"Database path: {db_path}")
|
|
|
|
# Back up existing database if it exists
|
|
if os.path.exists(db_path):
|
|
backup_path = db_path + '.backup'
|
|
try:
|
|
import shutil
|
|
shutil.copy2(db_path, backup_path)
|
|
print(f"Backed up existing database to {backup_path}")
|
|
except Exception as e:
|
|
print(f"Warning: Could not create backup - {str(e)}")
|
|
|
|
# Ensure directory exists
|
|
os.makedirs(os.path.dirname(db_path), exist_ok=True)
|
|
|
|
# Drop all tables and recreate them
|
|
print("Dropping all tables...")
|
|
db.drop_all()
|
|
|
|
print("Creating all tables...")
|
|
db.create_all()
|
|
|
|
# Create admin user
|
|
print("Creating admin user...")
|
|
admin = User(
|
|
username='admin',
|
|
email='admin@example.com',
|
|
is_admin=True,
|
|
created_at=datetime.utcnow()
|
|
)
|
|
admin.set_password('admin')
|
|
db.session.add(admin)
|
|
|
|
# Create regular user
|
|
print("Creating regular user...")
|
|
user = User(
|
|
username='user',
|
|
email='user@example.com',
|
|
is_admin=False,
|
|
created_at=datetime.utcnow()
|
|
)
|
|
user.set_password('user')
|
|
db.session.add(user)
|
|
|
|
try:
|
|
# Commit to generate user IDs
|
|
db.session.commit()
|
|
print("Users created successfully!")
|
|
|
|
# Create default categories
|
|
print("Creating default categories...")
|
|
create_default_categories()
|
|
|
|
print("Database rebuild completed successfully!")
|
|
return True
|
|
except Exception as e:
|
|
db.session.rollback()
|
|
print(f"Error during database rebuild: {str(e)}")
|
|
raise
|
|
|
|
if __name__ == "__main__":
|
|
rebuild_database() |