11
votes

Mettre à jour un schéma de base de données SQLite avec SQLALCHEMY et ELIXIR

J'ai créé une application Python qui utilise Elixir / Sqlalchemy pour stocker des données. La deuxième version du logiciel nécessite des fichiers créés dans la version précédente à mettre à jour afin d'ajouter / supprimer des tables et des colonnes.

Ma question est la suivante: comment puis-je y parvenir? Je suis au courant de Sqlalchemy-migrer , mais je dois dire que je trouve cela déroutant. Cela ne mentionne pas ce qui arrive à des données existantes. De plus, SQLite a Réduction du support de table d'alter , alors que migrera-t-il si j'essaie de supprimer une colonne ? Y a-t-il d'autres approches pour utiliser la migration?


0 commentaires

3 Réponses :


0
votes

Qu'est-ce qui vous confondre dans Sqlalchemy-migrer? 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 migration correcte pour tout 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.


0 commentaires

8
votes

De quoi vous parlez est un problème bien connu et assez complexe. Il est connu comme migration de base de données. Tout le bon projet a une stratégie qui décrit comment le schéma de base de données et les mutations de données devraient être appliqués à l'avance d'une version du produit à l'autre.

De nombreux cadres tels que Django ou Ruby On Rails ont un système de migration intégré ou disponible sous forme de plug-in. Votre cas avec Sqlalchemy a peu d'options:

  1. n'utilise aucun système. Il suffit d'écrire un /tmp/migrate.sql par les mains, d'écrire des instructions d'alternatif / goutte / crée, de traverser les doigts et de l'appliquer à votre base SQLite. C'est généralement une mauvaise idée puisqu'elle est sujette d'erreur, mais le choix est à vous. L'absence d'instruction ALTER TABLE peut être résolue en créant une nouvelle colonne avec les propriétés souhaitées avec nom temporaire, copiant toutes les données de la colonne d'origine, en supprimant la colonne d'origine et renommer une nouvelle colonne à l'original. Nom. La même technique pourrait être utilisée à la table.
  2. Utilisez un système de migration 3ème partie tel que Liquibase . Liquibase est cool, bien conçu et puissant, sauf un inconvénient. C'est vraiment buggy. Je l'ai essayé pour SQLite (et oui pour SQLalchemy, mais cela n'a pas d'importance en réalité), et il n'a pas réussi à faire des choses assez fondamentales. J'ai googlé pour des problèmes et j'ai constaté qu'ils sont des bugs connus.
  3. Utilisez SQLALCHEMY-Migrate que vous avez mentionnée. Ce n'est pas aussi puissant que les migrations ror qu'elle a été inspirée, ni elle n'est aussi puissante que Liquibase, mais cela fonctionne. La limitation de SQLite pourrait être travaillée de la même manière.

    Et vous avez posé des questions sur ce que SQLalchemy-Migrate fera si vous allez essayer de supprimer une colonne. Eh bien, il supprimera une colonne et supprimera donc des données qui y étaient. D'autres colonnes dans le tableau seront laissées intactes.


0 commentaires

5
votes

Une alternative plus récente à sqlalchemy-migrer 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 que cela ne supporte pas la modification de la table avec SQLite, c'est-à-dire qu'elle n'a pas de solution de contournement intégrée pour le support manquant de SQLite. (On pourrait affirmer que cela est hors de portée et pourrait être résolu par un package python spécialisé ou une extension SQLite.)


0 commentaires