Quick reference for database operations, schema management, and maintenance.
Tome uses two SQLite databases:
- Tome Database (
data/tome.db): Your reading progress, sessions, and streaks - Calibre Database: Your book metadata from Calibre
| Command | Description | Usage |
|---|---|---|
db:migrate |
Run all pending database migrations | Required for first-time setup, after schema changes, or when seeing "table not found" errors |
db:generate |
Generate migration from schema changes | Run after modifying lib/db/schema.ts to create migration files |
db:push |
Push schema changes directly (no migration) | |
db:studio |
Open Drizzle Studio visual database browser | Access at https://local.drizzle.studio to browse tables and data |
db:backup |
Create timestamped database backup | Creates backup in data/backups/ directory |
db:restore |
Restore database from backup (interactive) | Select from available backups to restore |
db:list-backups |
List all available backups with timestamps | Shows backups in data/backups/ with size and date |
db:reset |
Delete and recreate database from scratch | |
db:seed |
Seed database with test data | Useful for development and testing |
First-time setup:
npm run db:migrateAfter schema changes:
npm run db:generate # Generate migration from schema
npm run db:migrate # Apply the migrationBefore risky operations:
npm run db:backupDocker containers:
docker exec tome npm run db:backup
docker exec tome npm run db:migrateFor complete schema details, see lib/db/schema.ts.
Migrations are SQL files in drizzle/ that update the database schema incrementally.
Key features:
- Tracked in
__drizzle_migrationstable - Run in chronological order
- File-based locking prevents concurrent runs
- Automatic backups in Docker before each migration
To rollback: Use npm run db:restore to restore from backup
# View migration history
sqlite3 data/tome.db "SELECT * FROM __drizzle_migrations"
# Check database size
ls -lh data/tome.db
# Check for corruption
sqlite3 data/tome.db "PRAGMA integrity_check;"# Vacuum database to reclaim space
sqlite3 data/tome.db "VACUUM;"
# Analyze query performance
sqlite3 data/tome.db "ANALYZE;"# Open interactive shell
sqlite3 data/tome.db
# Example queries
sqlite> SELECT COUNT(*) FROM books;
sqlite> SELECT title, rating FROM books WHERE rating >= 4;
sqlite> .exit# Export entire database to SQL
sqlite3 data/tome.db .dump > tome-export.sql
# Import from SQL dump
sqlite3 data/tome.db < tome-export.sql
# Export as JSON (requires jq)
sqlite3 -json data/tome.db "SELECT * FROM reading_sessions" | jq '.' > sessions.jsonFor database issues, see TROUBLESHOOTING.md.
Common issues: database not found, migration failures, corruption recovery, permission errors, lock file issues.
- Drizzle ORM Documentation
- SQLite Documentation
- ARCHITECTURE.md - System architecture
- DEPLOYMENT.md - Production deployment