Skip to content

Troubleshooting

Solutions to common configuration issues.

"No configuration found"

Symptom

DBWardenConfigError: No configuration found

Causes & Solutions

Cause 1: No dbwarden.py file

# Check if file exists
ls dbwarden.py

Solution: Create dbwarden.py:

dbwarden init

Cause 2: Wrong directory

DBWarden looks in current directory and parents.

Solution: Navigate to project root:

cd /path/to/project
dbwarden migrate

Cause 3: No database_config() calls

Solution: Add configuration:

# dbwarden.py
from dbwarden import database_config

database_config(
    database_name="primary",
    default=True,
    database_type="sqlite",
    database_url="sqlite:///./app.db",
)

Cause 4: Import error in config file

# dbwarden.py
from app.models import Base  # ← Import fails

Solution: Fix imports or use lazy loading:

# Don't import models in config file
database_config(
    database_name="primary",
    model_paths=["app.models"],  # ← Use model_paths instead
    ...
)

"Exactly one default=True required"

Symptom

ConfigurationError: Exactly one default=True required

Causes & Solutions

Cause 1: No default database

# ❌ Wrong
database_config(database_name="primary", default=False, ...)
database_config(database_name="analytics", default=False, ...)

Solution: Set one database as default:

# ✅ Correct
database_config(database_name="primary", default=True, ...)
database_config(database_name="analytics", default=False, ...)

Cause 2: Multiple defaults

# ❌ Wrong
database_config(database_name="primary", default=True, ...)
database_config(database_name="analytics", default=True, ...)

Solution: Only one default:

# ✅ Correct
database_config(database_name="primary", default=True, ...)
database_config(database_name="analytics", ...)  # default=False implied

"Duplicate database_name"

Symptom

ConfigurationError: Duplicate database_name 'primary'

Cause

Same database_name used twice:

database_config(database_name="primary", ...)
database_config(database_name="primary", ...)  # ← Duplicate

Solution

Use unique names:

database_config(database_name="primary", ...)
database_config(database_name="analytics", ...)  # ← Different name

"No SQLAlchemy models found"

Symptom

Warning: No SQLAlchemy models found

Causes & Solutions

Cause 1: Wrong model_paths

# ❌ Wrong
model_paths=["models"]  # Not on PYTHONPATH

Solution: Use correct Python path:

# ✅ Correct
model_paths=["app.models"]

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:

database_config(
    database_name="primary",
    model_paths=["app.models"],  # ← Add this
    ...
)

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:

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from app.models.order import Order

"model_paths is required"

Symptom

ConfigurationError: model_paths is required when more than one database is configured

Cause

Multiple databases without model_paths:

# ❌ Wrong
database_config(database_name="primary", ...)
database_config(database_name="analytics", ...)  # No model_paths

Solution

Add model_paths to all databases:

# ✅ Correct
database_config(
    database_name="primary",
    model_paths=["app.models.primary"],
    ...
)
database_config(
    database_name="analytics",
    model_paths=["app.models.analytics"],
    ...
)

"model_paths overlap detected"

Symptom

ConfigurationError: model_paths overlap detected between 'primary' and 'analytics'

Cause

Same model paths for different databases:

# ❌ Wrong
database_config(
    database_name="primary",
    model_paths=["app.models"],
    ...
)
database_config(
    database_name="analytics",
    model_paths=["app.models"],  # ← Same path
    ...
)

Solutions

Solution 1: Use separate paths

# ✅ Correct
database_config(
    database_name="primary",
    model_paths=["app.models.primary"],
    ...
)
database_config(
    database_name="analytics",
    model_paths=["app.models.analytics"],
    ...
)

Solution 2: Allow overlap (if intentional)

# ✅ Correct for read replicas
database_config(
    database_name="primary",
    model_paths=["app.models"],
    overlap_models=True,
    ...
)
database_config(
    database_name="replica",
    model_paths=["app.models"],
    overlap_models=True,
    ...
)

"dev_database_url is required"

Symptom

ConfigurationError: dev_database_url is required when dev_database_type is set

Cause

Set dev_database_type without dev_database_url:

# ❌ Wrong
database_config(
    database_name="primary",
    dev_database_type="sqlite",
    # Missing dev_database_url
    ...
)

Solution

Add both dev parameters:

# ✅ Correct
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:

  1. Check database is running:
# PostgreSQL
sudo systemctl status postgresql

# Docker
docker ps | grep postgres
  1. Check connection URL:
# Verify host, port, credentials
database_url="postgresql://user:pass@localhost:5432/myapp"
  1. Test connection:
# PostgreSQL
psql -h localhost -U user -d myapp

# MySQL
mysql -h localhost -u user -p myapp

"authentication failed"

Cause: Wrong credentials.

Solutions:

  1. Check credentials:
# PostgreSQL
psql -h localhost -U user -d myapp
  1. Verify environment variable:
echo $DATABASE_URL
  1. 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:

-- PostgreSQL
CREATE DATABASE myapp;

-- MySQL
CREATE DATABASE myapp CHARACTER SET utf8mb4;

Import Errors

"ModuleNotFoundError"

Cause: Python can't find module.

Solutions:

  1. Check PYTHONPATH:
export PYTHONPATH=/path/to/project:$PYTHONPATH
  1. Install package:
pip install -e .  # Editable install
  1. Verify import:
python -c "import app.models"

Performance Issues

Slow configuration loading

Cause: Large codebase scan.

Solution: Specify model_paths:

# ❌ Slow - scans everything
database_config(database_name="primary", ...)

# ✅ Fast - targeted scan
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 database_config

database_config(...)

Debugging Tips

Enable verbose output

dbwarden --verbose migrate

Check configuration

# Show all configuration
dbwarden database

# Show specific database
dbwarden database --database primary

Test imports

python -c "import dbwarden; print('OK')"
python -c "from dbwarden import database_config; print('OK')"

Verify database connection

dbwarden check-db
dbwarden check-db --database primary

Recap

✅ Most issues are configuration or import errors
✅ Use dbwarden database to inspect configuration
✅ Use dbwarden check-db to test connections
✅ Specify model_paths for faster loading
✅ Check Python imports with python -c
✅ Use --verbose for detailed output

What's Next?