10

J'ai créé une application python qui utilise elixir/sqlalchemy pour stocker des données. La deuxième version du logiciel nécessite que tous les fichiers créés dans la version précédente soient mis à jour afin d'ajouter/supprimer des tables et des colonnes.Mise à jour d'un schéma de base de données sqlite avec sqlalchemy et elixir

Ma question est: comment puis-je y parvenir? Je suis au courant de sqlalchemy-migrate, mais je dois dire que je trouve cela déroutant. Il ne mentionne pas ce qu'il advient des données existantes. De plus, sqlite a reduced ALTER TABLE support, alors que va faire la migration si j'essaye de supprimer une colonne? Existe-t-il d'autres approches pour utiliser migrate?

Répondre

7

Ce dont vous parlez est un problème bien connu et assez complexe. C'est ce qu'on appelle la migration de base de données. Chaque bon projet a une politique qui décrit comment le schéma de la base de données et les mutations de données doivent être appliquées pour passer d'une version du produit à l'autre.

De nombreux frameworks tels que Django ou Ruby on Rails disposent d'un système de migration intégré ou disponible en tant que plug-in. Votre cas avec SQLAlchemy a peu d'options:

  1. N'utilisez aucun système. Il suffit d'écrire un /tmp/migrate.sql à la main, d'écrire les instructions ALTER/DROP/CREATE, de croiser les doigts et de l'appliquer à votre base SQLite. C'est généralement une mauvaise idée car elle est sujette aux erreurs, mais le choix vous appartient. L'absence d'une instruction complète ALTER TABLE peut être contournée en créant une nouvelle colonne avec les propriétés souhaitées avec un nom temporaire, en copiant toutes les données de la colonne d'origine, en supprimant la colonne d'origine et en renommant la nouvelle colonne par son nom d'origine. La même technique pourrait être utilisée au niveau de la table. Utilisez un système de migration tiers tel que liquibase. Liquibase est cool, bien conçu et puissant, sauf un inconvénient. C'est vraiment bogué. Je l'ai essayé pour SQLite (et oui pour SQLAlchemy, mais cela n'a pas d'importance), et il a échoué à faire des choses assez simples. J'ai cherché sur Google pour un problème et j'ai constaté qu'ils sont des bugs connus.
  2. Utilisez SQLAlchemy-migrate que vous avez mentionné. Il n'est pas aussi puissant que les migrations ROR dont il s'inspire, ni il est aussi puissant que la liquibase mais ça marche. La limitation de SQLite pourrait être travaillée de la même manière.

Et vous avez demandé ce que SQLAlchemy-migrate fera si vous essayez de supprimer une colonne. Eh bien, il va supprimer une colonne et donc supprimer toutes les données qui y étaient. Les autres colonnes du tableau seront laissées intactes.

0

Qu'est-ce qui vous trouble dans sqlalchemy-migrate? Il a --preview_sql et --preview_py options pour prévisualiser ce qu'il va faire. En général, il est impossible de faire la bonne migration pour n'importe quel cas possible, mais vous pouvez modifier le script de migration généré pour répondre à vos besoins. Il est facile d'obtenir des réponses au reste en l'essayant.

5

Une alternative plus récente à sqlalchemy-migrate est alembic, écrit par l'auteur de SQLAlchemy lui-même. Bien que ce dernier ("même auteur") ressemble à un argument fort, un inconvénient pourrait être qu'il ne supporte pas la table ALTERation avec SQLite, c'est-à-dire qu'il n'a pas de solution de contournement pour le support ALTER manquant de SQLite. (On pourrait faire valoir que cela est hors de portée et pourrait bien être résolu par un paquet python spécialisé ou une extension SQLite.)

Questions connexes