9
votes

Comment supprimer une contrainte de clé étrangère à Sqlalchemy?

J'utilise SQLalchemy migrer pour garder une trace des modifications de la base de données et je suis en cause avec la suppression d'une clé étrangère. J'ai deux tables, T_New est une nouvelle table et T_exists est une table existante. J'ai besoin d'ajouter t_new, puis ajoutez une clé étrangère à T_exists. Ensuite, j'ai besoin de pouvoir inverser l'opération (qui est où je rencontre des problèmes).

t_exists.c.new_id.drop()
t_new.drop()


0 commentaires

4 Réponses :


3
votes

J'ai pu accomplir cela en créant une instance de métadonnées séparée et en utilisant la session.execute () pour exécuter RAW SQL. Idéalement, il y aurait une solution qui utilise SQLalchemy exclusivement, donc je n'aurais donc pas à utiliser des solutions spécifiques à MySQL. Mais à ce jour, je ne suis pas au courant d'une telle solution.


1 commentaires

Par curiosité, quel était le SQL que vous avez exécuté?



-1
votes

Eh bien, vous pouvez y parvenir à SQLalchemy: juste goutte () code> toutes les contraintes avant de Drop () code> la colonne (théoriquement, vous pourriez avoir plusieurs contraintes) :

def drop_column(column):
    for fk in column.table.foreign_keys:
        if fk.column == column:
            print 'deleting fk ', fk
            fk.drop()
    column.drop()

drop_column(t_exists.c.new_id)


4 commentaires

J'ai essayé ceci, mais j'ai eu une erreur: "l'objet Foreigney 'n'a aucun attribut" goutte ". J'ai vérifié les documents mais je n'ai vu aucun moyen de le faire: sqlalchemy.org/docs/reference/sqlalchemy/...


C'est juste, mais montre-moi la documentation de SA où colonne est tombée (): sqlalchemy.org/docs/reference/sqlalchemy/...


'SQLalchemy-Migrate' Ajoute une chute (), Créer () et d'autres soirières, mais il doit être installé séparément. Voir packages.python.org/sqlalchemy-migrate/index.html


SQLALCHEMY-Migrate Ajoute une goutte () et créer () à Fored ForeTeyKyConstraint Pas Foreykey.



0
votes

Je crois que vous pouvez y parvenir avec SQLALCHEMY-Migrate. Notez qu'un dessin à l'entreprise est sur une colonne isolée. Une structure ForeTeyConstraint est au niveau de la table et raconte les colonnes ensemble. Si vous regardez l'objet de l'équipement de l'équipement sur la colonne, vous verrez qu'il se réfère à une entreprise de fourrette étrangère.

Je ne pouvais pas tester cette idée en raison des deux bases de données que j'utilise MS SQL n'est pas prise en charge par SQLalchemy-Migrate et SQLite ne prend pas en charge "Alter Table" pour des contraintes. J'ai eu Sqlalchemy d'essayer de supprimer un FK via une chute de la contrainte de références sur une table SQLite afin qu'elle soit bonne. Ymmv.


0 commentaires

6
votes

Vous pouvez le faire avec SQLALCHEMY.MIGRATE.

Pour le faire fonctionner, j'ai dû créer explicitement la contrainte de clé étrangère plutôt que implicitement avec la colonne ('FK_Table.field') ):

hélas, au lieu de faire cela: xxx

fais cela: xxx

alors puis Le processus de suppression ressemble à ceci: xxx


1 commentaires

Pour toute personne susceptible de s'exprimer - Fored Fored ForeyConstraint doit être importée à partir de migrer pas de sqlalchemy .