4 votes

SqlAlchemy : Comment implémenter DROP TABLE ... CASCADE ?

J'ai besoin de supprimer des tables dans une base de données PostgreSQL qui ont des contraintes de clé étrangère et qui requièrent DROP TABLE ... CASCADE .

Je pouvais exécuter du code SQL brut : engine.execute("DROP TABLE %s CASCADE;" % table.name) . Cependant, j'aimerais mettre en œuvre ce comportement de telle sorte que je puisse faire ce qui suit table.drop(engine) pour les postgresql dialecte.

Comment aborder cette question ?

11voto

Iraedei Points 487

Vous pouvez personnaliser la compilation des constructions comme ceci :

from sqlalchemy.schema import DropTable
from sqlalchemy.ext.compiler import compiles

@compiles(DropTable, "postgresql")
def _compile_drop_table(element, compiler, **kwargs):
    return compiler.visit_drop_table(element) + " CASCADE"

Il s'agit de l'ajout de CASCADE à la DROP TABLE émise pour le dialecte postgresql tout en gardant les autres dialectes inchangés.

0voto

jmelesky Points 1663

Vous avez besoin des données dans pg_constraint qui est un tableau assez compliqué qui gère toutes les contraintes, y compris les contraintes de vérification et les clés étrangères. Heureusement, ce que vous voulez est assez simple.

Pour obtenir la liste de toutes les tables faisant référence à la table foo vous pouvez faire quelque chose comme :

SELECT conrelid
  FROM pg_constraint
  WHERE confrelid = <the relid for foo>;

Vous obtiendrez ainsi une liste de liens de table. Mais vous n'avez probablement pas envie de vous occuper de relids, alors rendons les choses un peu plus compliquées :

SELECT r.schemaname || '.' || r.relname
  FROM pg_stat_user_tables r, pg_constraint c, pg_stat_user_tables s
  WHERE
    s.relid = c.confrelid AND
    c.conrelid = r.relid AND
    s.relname = 'foo';

Cela renvoie une liste que vous pouvez ensuite parcourir en boucle et envoyer des messages individuels. DROP TABLE déclarations.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X