2010-04-16 15 views
10

Ho creato un'applicazione python che utilizza elixir/sqlalchemy per archiviare i dati. La seconda versione del software richiede l'aggiornamento di tutti i file creati nella versione precedente per aggiungere/eliminare tabelle e colonne.Aggiornamento di uno schema di database sqlite con sqlalchemy ed elisir

La mia domanda è: come posso ottenere questo? Sono a conoscenza di sqlalchemy-migrate, ma devo dire che trovo confuso. Non menziona cosa succede ai dati esistenti. Inoltre, sqlite ha reduced ALTER TABLE support, quindi cosa eseguirà la migrazione se cerco di eliminare una colonna? Esistono altri approcci all'utilizzo della migrazione?

risposta

7

Quello di cui stai parlando è un problema ben noto e piuttosto complesso. È noto come migrazione del database. Ogni buon progetto ha una politica che descrive come applicare lo schema del database e le mutazioni dei dati per passare da una versione del prodotto all'altra.

Molti framework come Django o Ruby on Rails hanno un sistema di migrazione integrato o disponibile come plug-in. Il tuo caso con SQLAlchemy ha poche opzioni:

  1. Non utilizzare alcun sistema. Basta scrivere un /tmp/migrate.sql con le mani, annotare le istruzioni ALTER/DROP/CREATE, incrociare le dita e applicarlo alla base SQLite. In genere è una cattiva idea poiché è soggetta a errori, ma la scelta spetta a te. L'assenza dell'istruzione ALTER TABLE con tutte le funzionalità potrebbe essere aggirata creando una nuova colonna con le proprietà desiderate con nome temporaneo, copiando tutti i dati dalla colonna originale, rimuovendo la colonna originale e rinominando la nuova colonna con il nome originale. La stessa tecnica potrebbe essere utilizzata a livello di tavolo.
  2. Utilizzare alcuni sistemi di migrazione di terze parti come liquibase. Liquibase è bello, ben progettato e potente, tranne uno svantaggio. È davvero buggy. L'ho provato per SQLite (e sì per SQLAlchemy, ma in realtà non importa), e non è riuscito a fare alcune cose piuttosto semplici. Ho cercato su Google un problema e ho scoperto che si tratta di bug noti.
  3. Usa la migrazione di SQLAlchemy che hai menzionato. Non è potente come le migrazioni ROR da cui è stato ispirato, né è potente quanto il liquibase ma funziona. La limitazione di SQLite potrebbe essere aggirata nello stesso modo.

E hai chiesto informazioni su cosa eseguirà la migrazione di SQLAlchemy se tenterai di eliminare una colonna. Bene, cancellerà una colonna e quindi cancellerà tutti i dati che ci sono dentro. Altre colonne nella tabella saranno lasciate intatte.

0

Che cosa ti confonde in sqlalchemy-migrate? Dispone di opzioni --preview_sql e --preview_py per vedere cosa sta per fare. In generale è impossibile eseguire correttamente la migrazione per ogni possibile caso, ma è possibile modificare lo script di migrazione generato in base alle proprie esigenze. È facile ottenere risposte al resto provandolo.

5

Un'alternativa più recente a sqlalchemy-migrate è alembic, scritta dall'autore di SQLAlchemy stesso. Anche se quest'ultimo ("lo stesso autore") sembra un argomento forte, uno svantaggio potrebbe essere che non supporta la tabella ALTERation con SQLite, cioè non ha soluzioni integrate per il supporto di ALTER mancante di SQLite. (Si potrebbe obiettare che è fuori portata e potrebbe essere risolto da un pacchetto python specializzato o da un'estensione SQLite.)

Problemi correlati