Database migrations
Πώς δημιουργούμε, ελέγχουμε και εφαρμόζουμε ασφαλείς Django migrations.
Η ροή είναι:
models.py
-> makemigrations
-> migration file
-> migrate
-> database table1. Γράψτε ή αλλάξτε το μοντέλο
Παράδειγμα αρχείου:
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_organization4. Ελέγξτε τη μεταναστευτική κατάσταση
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 για κάθε υπάρχοντα οργανισμό.
