Tutorial

Django-Datenbank mit realistischen Testdaten befüllen

Fixtures veralten, Factories sind pro Test, und ein handgeschriebener Seed-Befehl bricht bei jeder Schema-Änderung. So befüllst du eine Django-Datenbank mit realistischen, fremdschlüssel-konsistenten Daten direkt aus deiner models.py.

SeedBase · ~6 Min. Lesezeit

Warum Seeding in Django nervt

Jedes Django-Projekt läuft gegen dieselbe Wand, sobald das Schema über eine Handvoll Models hinauswächst. Alle üblichen Wege für Testdaten haben einen Haken:

Was du eigentlich willst: etwas auf die bereits vorhandenen Models zeigen und eine befüllte Datenbank bekommen, in der jeder Fremdschlüssel aufgeht. Hier der ganze Ablauf.

Schritt 1, auf deine models.py zeigen

SeedBase liest deine Django-Models direkt. Füge deine models.py ein oder pushe das ganze Projekt mit einem Klick aus dem PyCharm- oder VS-Code-Plugin. Nimm einen typischen Shop:

class Customer(models.Model):
    name  = models.CharField(max_length=120)
    email = models.EmailField(unique=True)
    city  = models.CharField(max_length=80)

class Product(models.Model):
    sku   = models.CharField(max_length=32, unique=True)
    name  = models.CharField(max_length=200)
    price = models.DecimalField(max_digits=10, decimal_places=2)

class Order(models.Model):
    STATUS = [("pending", "Pending"), ("paid", "Paid"), ("shipped", "Shipped")]
    customer   = models.ForeignKey(Customer, on_delete=models.CASCADE)
    status     = models.CharField(max_length=16, choices=STATUS)
    created_at = models.DateTimeField(auto_now_add=True)

class OrderItem(models.Model):
    order    = models.ForeignKey(Order, related_name="items", on_delete=models.CASCADE)
    product  = models.ForeignKey(Product, on_delete=models.PROTECT)
    quantity = models.PositiveIntegerField()

Der Parser versteht Django, nicht nur generisches SQL:

Schritt 2, generieren

Auf Generieren klicken. Der Teil, der Django-Daten überhaupt ladbar macht, passiert hier:

Schritt 3, realistisch, nicht nur gültig

Gültige Daten, bei denen jede Zeile gleich aussieht, verstecken trotzdem Bugs. Ein paar Dinge, die sie sich wie Produktion verhalten lassen:

Schritt 4, in deine Datenbank laden

Als SQL exportieren und direkt in die Projekt-Datenbank pipen, mit aktivierten Constraints, weil die Inserts schon in FK-Reihenfolge stehen:

# direkt in die in Django konfigurierte Datenbank
python manage.py dbshell < seed.sql

# oder klassisch psql
psql "$DATABASE_URL" -f seed.sql

Oder die Datei überspringen und per CLI ziehen, praktisch in einem Makefile oder beim frischen Dev-Setup:

pip install seedbase
seedbase pull --project <id> --format sql --out seed.sql

Du kannst auch in der UI eine Datenbank verbinden und die Zeilen direkt pushen, ganz ohne SQL-Datei.

Schritt 5, in CI reproduzierbar machen

Die Generierung ist pro Seed deterministisch, ein CI-Lauf bekommt also jedes Mal exakt dieselbe Datenbank. Das Python-SDK und das pytest-Plugin ziehen geseedete Daten direkt in deine Test-Datenbank, und du kannst die Generierungs-Config als JSON neben deinen Migrations committen, damit das ganze Team denselben Datensatz aus denselben Models neu erzeugt.

Wofür das gedacht ist. Es füllt eine Dev-Datenbank, Staging, ein Demo oder einen CI-Container mit einem kohärenten Datensatz direkt aus deinen Models. Für den Objekt-Aufbau innerhalb eines einzelnen Tests ist factory_boy weiterhin das richtige Werkzeug. Sie lösen verschiedene Probleme und ergänzen sich gut.

Das ist der ganze Loop

models.py rein, generieren, laden. Die harten Teile (Insert-Reihenfolge, jeden Fremdschlüssel auflösen, abstrakte Basen, Through-Tabellen, realistische Schiefe) sind erledigt, du schreibst keinen Seed-Befehl mehr von Hand. Getestet an einem echten Django-Projekt mit 20 Apps und 226 Models, daher kommen die meisten Edge-Cases. Derselbe Ansatz funktioniert für jedes Schema, SQL und Prisma inklusive.

Deine Django-Datenbank befüllen, kostenlos

Füge deine models.py ein oder pushe sie aus deiner IDE, generiere eine befüllte, FK-konsistente Datenbank und lade sie mit manage.py dbshell. Free-Tier, keine Kreditkarte.

  • Jeder FK geht auf
  • Realistische Verteilungen
  • SQL / CSV / JSON
  • EU-gehostet
Django-Testdaten generieren, kostenlos

Mehr: Testdaten generieren · vs Faker · DSGVO-Anonymisierung