Troubleshooting¶
Solutions to common configuration issues.
New projects should declare fields on a DbwardenDatabase subclass. The
database_config(...) function alternative is also supported.
"No configuration found"¶
Symptom¶
Causes & Solutions¶
Cause 1: No dbwarden.py file
Solution: Create dbwarden.py:
Cause 2: Wrong directory
dbwarden looks in current directory and parents.
Solution: Navigate to project root:
Cause 3: No database configuration
Solution: Add configuration:
# dbwarden.py
from dbwarden import DbwardenDatabase
class Primary(DbwardenDatabase):
database_name = "primary"
default = True
database_type = "sqlite"
database_url_sync = "sqlite:///./app.db"
Cause 4: Import error in config file
Solution: Fix imports or use lazy loading:
# Don't import models in config file
primary = database_config(
database_name="primary",
model_paths=["app.models"], # Use model_paths instead
)
"Exactly one default=True required"¶
Symptom¶
Causes & Solutions¶
Cause 1: No default database
Solution: Set one database as default:
Cause 2: Multiple defaults
Solution: Only one default:
"Duplicate database_name"¶
Symptom¶
Cause¶
Same database_name used twice:
Solution¶
Use unique names:
"No SQLAlchemy models found"¶
Symptom¶
Causes & Solutions¶
Cause 1: Wrong model_paths
Solution: Use correct Python path:
Cause 2: Models not imported
# app/models/__init__.py
# Wrong - models not imported
from sqlalchemy.orm import DeclarativeBase
class Base(DeclarativeBase):
pass
Solution: Import models:
# app/models/__init__.py
# Correct
from sqlalchemy.orm import DeclarativeBase
from app.models.user import User
from app.models.order import Order
class Base(DeclarativeBase):
pass
Cause 3: Missing model_paths
Solution: Add model_paths:
Cause 4: Circular imports
# app/models/user.py
from app.models.order import Order # Circular
# app/models/order.py
from app.models.user import User # Circular
Solution: Use TYPE_CHECKING:
"model_paths is required"¶
Symptom¶
Cause¶
Multiple databases without model_paths:
Solution¶
Add model_paths to all databases:
# Correct
primary = database_config(
database_name="primary",
model_paths=["app.models.primary"],
)
analytics = database_config(
database_name="analytics",
model_paths=["app.models.analytics"],
)
"model_paths overlap detected"¶
Symptom¶
ConfigurationError: model_paths overlap detected: path 'app.models' from 'analytics' is also defined in 'primary'; set overlap_models=True to allow
Cause¶
Same model paths for different databases:
# Wrong
primary = database_config(
database_name="primary",
model_paths=["app.models"],
)
analytics = database_config(
database_name="analytics",
model_paths=["app.models"], # Same path
)
Solutions¶
Solution 1: Use separate paths
# Correct
primary = database_config(
database_name="primary",
model_paths=["app.models.primary"],
)
analytics = database_config(
database_name="analytics",
model_paths=["app.models.analytics"],
)
Solution 2: Allow overlap (if intentional)
# Correct for read replicas
primary = database_config(
database_name="primary",
model_paths=["app.models"],
overlap_models=True,
)
replica = database_config(
database_name="replica",
model_paths=["app.models"],
overlap_models=True,
)
"model_tables overlap detected"¶
Symptom¶
ConfigurationError: model_tables overlap detected: table 'users' in 'primary' is also in 'analytics'
Cause¶
Two databases have model_tables lists that share table names:
# Wrong
primary = database_config(
database_name="primary",
model_paths=["app.models"],
model_tables=["users", "posts"],
)
analytics = database_config(
database_name="analytics",
model_paths=["other_models"],
model_tables=["users"], # 'users' already owned by primary
)
Solutions¶
Solution 1: Remove duplicate table name
# Correct
analytics = database_config(
database_name="analytics",
model_paths=["other_models"],
model_tables=["analytics_events"], # No overlap with primary
)
Solution 2: Allow overlap (if intentional)
# Correct for shared tables
analytics = database_config(
database_name="analytics",
model_paths=["other_models"],
model_tables=["users", "analytics_events"],
overlap_models=True, # Allow overlap
)
"dev_database_url is required"¶
Symptom¶
Cause¶
Set dev_database_type without dev_database_url:
# Wrong
primary = database_config(
database_name="primary",
dev_database_type="sqlite",
# Missing dev_database_url
)
Solution¶
Add both dev parameters:
# Correct
primary = database_config(
database_name="primary",
dev_database_type="sqlite",
dev_database_url="sqlite:///./dev.db", # Add this
)
Connection Errors¶
"could not connect to server"¶
Cause: Database server not running or unreachable.
Solutions:
- Check database is running:
- Check connection URL:
- Test connection:
"authentication failed"¶
Cause: Wrong credentials.
Solutions:
- Check credentials:
- Verify environment variable:
- URL encode special characters:
from urllib.parse import quote_plus
password = "p@ss:word"
encoded = quote_plus(password) # "p%40ss%3Aword"
"database does not exist"¶
Cause: Database not created.
Solution: Create database:
Import Errors¶
"ModuleNotFoundError"¶
Cause: Python can't find module.
Solutions:
- Check PYTHONPATH:
- Install package:
- Verify import:
Performance Issues¶
Slow configuration loading¶
Cause: Large codebase scan.
Solution: Specify model_paths:
# Slow - scans everything
primary = database_config(
database_name="primary",
)
# Fast - targeted scan
primary = database_config(
database_name="primary",
model_paths=["app.models"],
)
Slow imports¶
Cause: Heavy imports in config file.
Solution: Avoid imports in dbwarden.py:
# Slow
from app.models import Base
from app.services import setup
# Fast
from dbwarden import DbwardenDatabase
class Primary(DbwardenDatabase):
...
Debugging Tips¶
Enable verbose output¶
Check configuration¶
# Show all configuration
$ dbwarden settings show
# Show specific database
$ dbwarden settings show primary
Test imports¶
python -c "import dbwarden; print('OK')"
python -c "from dbwarden import database_config; print('OK')"
Verify database connection¶
What's Next?¶
- Configuration API Reference - Complete parameter docs
- Quick Start - Start fresh with correct setup
- CLI option inventory - Every built-in flag, including
--disable-skip
Exit code 3¶
Exit code 3 can report a skipped database or a safety ceiling stop; inspect the
accompanying result before treating it as success. See
safety-scoped migrations for the
severity ceiling semantics.