mirror of https://github.com/vapor/docs.git
97 lines
3.4 KiB
Markdown
97 lines
3.4 KiB
Markdown
# Migrazioni
|
|
|
|
Le migrazioni sono come un sistema di controllo versione per il tuo database. Ogni migrazione definisce un cambiamento al database e come disfarlo. Utilizzando le migrazioni per applicare modifiche al database, stabilisci un approccio coeso, testabile, e condivisibile per evolvere nel tempo i tuoi database.
|
|
|
|
```swift
|
|
// Un esempio di migrazione.
|
|
struct MyMigration: Migration {
|
|
func prepare(on database: any Database) -> EventLoopFuture<Void> {
|
|
// Fai una modifica al database.
|
|
}
|
|
|
|
func revert(on database: any Database) -> EventLoopFuture<Void> {
|
|
// Disfai le modifiche fatte in `prepare`, se possibile.
|
|
}
|
|
}
|
|
```
|
|
|
|
Se usi `async`/`await` devi implementare il protocollo `AsyncMigration`:
|
|
|
|
```swift
|
|
struct MyMigration: AsyncMigration {
|
|
func prepare(on database: any Database) async throws {
|
|
// Fai una modifica al database.
|
|
}
|
|
|
|
func revert(on database: any Database) async throws {
|
|
// Disfai le modifiche fatte in `prepare`, se possibile.
|
|
}
|
|
}
|
|
```
|
|
|
|
Il metodo `prepare` è dove fai le modifiche al `Database` fornito. Potrebbero essere modifiche allo schema del database come aggiungere o rimuovere una relazione o una collezione, attributo, o vincolo. Possono anche modificare il contenuto del database, come creare nuove istanze del modello, aggiornare valori di un attributo, o fare pulizia.
|
|
|
|
Il metodo `revert` è dove disfai queste modifiche, se possibile. Essere in grado di disfare le migrazioni può rendere la prototipazione e il testing più facili. Forniscono anche un piano di backup se un deploy in produzione non va come pianificato.
|
|
|
|
## Registra
|
|
|
|
Le migrazioni vengono registrate alla tua applicazione usando `app.migrations`.
|
|
|
|
```swift
|
|
import Fluent
|
|
import Vapor
|
|
|
|
app.migrations.add(MyMigration())
|
|
```
|
|
|
|
Puoi aggiungere una migrazione a un database specifico usando il parametro `to`, altrimenti sarà utilizzato il database di default.
|
|
|
|
```swift
|
|
app.migrations.add(MyMigration(), to: .myDatabase)
|
|
```
|
|
|
|
Le migrazioni dovrebbero essere listate in ordine di dipendenza. Per esempio, se `MigrationB` dipende da `MigrationA`, deve essere aggiunto a `app.migrations` per secondo.
|
|
|
|
## Migra
|
|
|
|
Per migrare il tuo database, esegui il comando `migrate`.
|
|
|
|
```sh
|
|
swift run App migrate
|
|
```
|
|
|
|
Puoi anche eseguire questo [comando attraverso Xcode](../advanced/commands.md#xcode). Il comando di migrazione controllerà il database per vedere se sono state registrate nuove migrazioni dall'ultima volta in cui è stato eseguito. Se ci sono nuove migrazioni, chiederà una conferma prima di eseguirle.
|
|
|
|
### Ripristinare
|
|
|
|
Per disfare una migrazione sul tuo database, esegui `migrate` con la flag `--revert`.
|
|
|
|
```sh
|
|
swift run App migrate --revert
|
|
```
|
|
|
|
Il comando controllerà il database per vedere quale gruppo di migrazioni è stato eseguito per ultimo e chiederà conferma prima di ripristinarle.
|
|
|
|
### Migra Automaticamente
|
|
|
|
Se vuoi che le migrazioni vengano eseguite automaticamente prima degli altri comandi, puoi passare la flag `--auto-migrate`.
|
|
|
|
```sh
|
|
swift run App serve --auto-migrate
|
|
```
|
|
|
|
Puoi farlo anche programmaticamente.
|
|
|
|
```swift
|
|
try app.autoMigrate().wait()
|
|
|
|
// oppure
|
|
try await app.autoMigrate()
|
|
```
|
|
|
|
Entrambe queste opzioni esistono anche per ripristinare: `--auto-revert` e `app.autoRevert()`.
|
|
|
|
## Prossimi Passi
|
|
|
|
Per avere più informazioni riguardo a cosa mettere dentro le tue migrazioni, consulta le guide per [costruire gli schemi](schema.md) e per [costruire le query](query.md).
|