bublliodocs
Ανάπτυξη και λειτουργία

Database migrations

Πώς δημιουργούμε, ελέγχουμε και εφαρμόζουμε ασφαλείς Django migrations.

Η ροή είναι:

models.py
  -> makemigrations
  -> migration file
  -> migrate
  -> database table

1. Γράψτε ή αλλάξτε το μοντέλο

Παράδειγμα αρχείου:

src/organizations/models.py

Παράδειγμα μοντέλου:

import uuid

from django.db import models


class Organization(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=255)
    slug = models.SlugField(max_length=255, unique=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

Γιατί:

  • id είναι ένα UUID, έτσι το δημόσιο API δεν εκθέτει ακέραιες ταυτότητες όπως 1, 2, 3.
  • name είναι το ορατό όνομα οργάνωσης.
  • slug είναι ένα φιλικό προς το URL μοναδικό αναγνωριστικό.
  • Το created_at τίθεται μία φορά όταν δημιουργείται η γραμμή.
  • Το updated_at αλλάζει κάθε φορά που η γραμμή αποθηκεύεται.
  • __str__ ελέγχει πώς το αντικείμενο εμφανίζεται σε Django admin και κέλυφος.

2. Δημιουργία Migrationς

uv run python src/manage.py makemigrations

Ή για μια εφαρμογή:

uv run python src/manage.py makemigrations organizations

Αυτό δημιουργεί ένα αρχείο όπως:

src/organizations/migrations/0001_initial.py

Σημαντικό: Το makemigrations δεν αλλάζει τη βάση δεδομένων. Δημιουργεί ένα αρχείο migrationς.

3. Εφαρμογή Migrationς

uv run python src/manage.py migrate

Αυτό αλλάζει τη βάση δεδομένων.

Για το Organization, δημιουργεί έναν πίνακα όπως:

organizations_organization

4. Ελέγξτε τη μεταναστευτική κατάσταση

uv run python src/manage.py showmigrations

Έλεγχοι migrationς μοιάζουν με:

[X] 0001_initial

Οι ανεξέλεγκτες migrations μοιάζουν με:

[ ] 0001_initial

Σημαντικές σημειώσεις

Τα αρχεία migrationς είναι πηγαίος κώδικας. Δεσμεύσου τους να φύγουν.

Η τοπική βάση δεδομένων SQLite δεν είναι πηγαίος κώδικας. Μην το διαπράξετε:

src/db.sqlite3

Εάν αλλάξετε ένα μοντέλο, τρέξτε:

uv run python src/manage.py makemigrations
uv run python src/manage.py migrate

Η αλλαγή πρωτεύοντος τύπου κλειδιού είναι ευαίσθητη.

Παράδειγμα:

integer id -> UUID id

Εάν υπάρχουν ήδη σειρές, αυτό μπορεί να σπάσει τα τοπικά δεδομένα εκτός εάν το χειριστούμε προσεκτικά.

Για τα τοπικά δεδομένα μάθησης, είναι μερικές φορές εντάξει να επαναφέρετε την τοπική βάση δεδομένων. Για τα δεδομένα παραγωγής, μην διαγράφετε ποτέ τη βάση δεδομένων· γράψτε ένα σχέδιο προσεκτικής migrationς.

Οι migrations πρέπει να παραμείνουν φορητές σε κάθε βάση δεδομένων backend το έργο ισχυρίζεται ότι υποστηρίζει. Εκτέλεση τους κατά SQLite και PostgreSQL όταν μια αλλαγή εξαρτάται από τη συμπεριφορά της βάσης δεδομένων. Η αλλαγή DATABASE_URL επιλέγει μια άλλη βάση δεδομένων· δεν μετακινεί τα υπάρχοντα αρχεία μεταξύ βάσεων δεδομένων.

Σημείωμα migrationς μελών

Η migration organizations.0002_organizationmembership εισάγει τον έλεγχο πρόσβασης. Σκόπιμα δεν ορίζει Owner για οργανισμούς που προϋπήρχαν, επειδή το παλιό schema δεν περιέχει αξιόπιστη αντιστοίχιση χρηστών με οργανισμούς. Αφού την εφαρμόσετε σε υπάρχουσα development database, χρησιμοποιήστε Django superuser στο /admin/ για να δημιουργήσετε Owner membership για κάθε υπάρχοντα οργανισμό.