Migrering av databaser¶
Alla dessa operationer är tillgängliga från modulen django.contrib.postgres.operations
.
Skapa tillägg med hjälp av migreringar¶
Du kan skapa ett PostgreSQL-tillägg i din databas med hjälp av en migreringsfil. Detta exempel skapar en hstore-förlängning, men samma principer gäller för andra tillägg.
Ställ in hstore-tillägget i PostgreSQL före den första CreateModel
eller AddField
-operationen som involverar HStoreField
genom att lägga till en migrering med HStoreExtension
-operationen. Till exempel:
from django.contrib.postgres.operations import HStoreExtension
class Migration(migrations.Migration):
...
operations = [HStoreExtension(), ...]
Operationen hoppar över att lägga till tillägget om det redan finns.
För de flesta tillägg kräver detta en databasanvändare med superanvändarrättigheter. Om Django-databasanvändaren inte har lämpliga privilegier måste du skapa tillägget utanför Django-migreringar med en användare som har dem. I så fall ansluter du till din Django-databas och kör frågan CREATE EXTENSION IF NOT EXISTS hstore;
.
CreateExtension
¶
BloomExtension
¶
BtreeGinExtension
¶
BtreeGistExtension
¶
CITextExtension
¶
CryptoExtension
¶
HStoreExtension
¶
TrigramExtension
¶
UnaccentExtension
¶
Hantera kollationer med hjälp av migreringar¶
Om du behöver filtrera eller beställa en kolumn med en viss kollationering som ditt operativsystem tillhandahåller men PostgreSQL inte gör det, kan du hantera kollationer i din databas med hjälp av en migreringsfil. Dessa kollationer kan sedan användas med parametern db_collation
på CharField
, TextField
, och deras underklasser.
Till exempel:, för att skapa en kollationering för tysk telefonkatalogbeställning:
from django.contrib.postgres.operations import CreateCollation
class Migration(migrations.Migration):
...
operations = [
CreateCollation(
"case_insensitive",
provider="icu",
locale="und-u-ks-level2",
deterministic=False,
),
...,
]
Samtidiga indexoperationer¶
PostgreSQL stöder alternativet CONCURRENTLY
till CREATE INDEX
och DROP INDEX
uttalanden för att lägga till och ta bort index utan att låsa ut skrivningar. Det här alternativet är användbart för att lägga till eller ta bort ett index i en live produktionsdatabas.
- class AddIndexConcurrently(model_name, index)[source]¶
Som
AddIndex
, men skapar ett index med alternativetCONCURRENTLY
. Detta har några försiktighetsåtgärder att vara medveten om när du använder det här alternativet, se `` PostgreSQL-dokumentationen för att bygga index samtidigt <https://www.postgresql.org/docs/current/ sql-createindex.html#SQL-CREATEINDEX-CONCURRENTLY>`_.
- class RemoveIndexConcurrently(model_name, name)[source]¶
Som
RemoveIndex
, men tar bort indexet med alternativetCONCURRENTLY
. Detta har några varningar att vara medvetna om när du använder det här alternativet, se PostgreSQL-dokumentationen.
Observera
Alternativet CONCURRENTLY
stöds inte inom en transaktion (se non-atomic migration <non-atomic-migrations>`).
Lägga till begränsningar utan att tvinga fram validering¶
PostgreSQL stöder alternativet `` INOT VALID`` med uttalandet `` ADD CONSTRAINT`` för att lägga till kontrollbegränsningar utan att genomdriva validering på befintliga rader. Det här alternativet är användbart om du vill hoppa över den potentiellt långa genomsökningen av tabellen för att verifiera att alla befintliga rader uppfyller begränsningen.
Om du vill validera kontrollbegränsningar som skapats med alternativet NOT VALID
vid en senare tidpunkt använder du operationen ValidateConstraint
.
Se ”PostgreSQL-dokumentationen <https://www.postgresql.org/docs/current/ sql-altertable.html#SQL-ALTERTABLE-NOTES>`__ för mer information.
- class AddConstraintNotValid(model_name, constraint)[source]¶
Som
AddConstraint
, men undviker att validera begränsningen på befintliga rader.
- class ValidateConstraint(model_name, name)[source]¶
Skannar igenom tabellen och validerar den angivna kontrollbegränsningen på befintliga rader.
Observera
operationerna AddConstraintNotValid
och ValidateConstraint
bör utföras i två separata migreringar. Att utföra båda operationerna i samma atomiska migrering har samma effekt som AddConstraint
, medan att utföra dem i en enda icke-atomisk migrering kan lämna din databas i ett inkonsekvent tillstånd om operationen ValidateConstraint
misslyckas.