Je serais intéressé de laisser tomber toutes les tables dans un schéma redshift. Même si cette solution fonctionne
DO $$ DECLARE r RECORD; BEGIN -- if the schema you operate on is not "current", you will want to -- replace current_schema() in query with 'schematodeletetablesfrom' -- *and* update the generate 'DROP...' accordingly. FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE'; END LOOP; END $$;
5 Réponses :
Exécutez ce SQL et copiez + Coller le résultat sur votre client SQL. Si vous voulez le faire de manière programmatique, vous devez construire un petit code bit autour de lui.
SELECT 'DROP TABLE IF EXISTS ' || tablename || ' CASCADE;' FROM pg_tables WHERE schemaname = '<your_schema>'
Utilisation de python et PYSCOPG2 Je suis venu avec ce script pour supprimer toutes les tables dans SCHEMA CODE>:
import logging
import psycopg2
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger('redshift_debug')
schema = "schema_to_be_deleted"
try:
conn = psycopg2.connect("dbname='{}' port='{}' host='{}' user='{}' password='{}'".format("DB_NAME", "DB_PORT", "DB_HOST", "DB_USER", "DB_PWD"))
cursor = conn.cursor()
cursor.execute("SELECT tablename FROM pg_tables WHERE schemaname = '%s'" % schema)
rows = cursor.fetchall()
for row in rows:
logger.info("Dropping table " + row[0] + "...")
cursor.execute("DROP TABLE {}.{}".format(schema, row[0]))
cursor.close()
conn.commit()
except psycopg2.DatabaseError as error:
logger.error(error)
finally:
if conn is not None:
conn.close()
Comment importer la bibliothèque?
Si vous parlez de psycopg2 code>, je pense qu'un
pips facile installer psycopg2 code> doit faire le travail si vous utilisez PIP comme gestionnaire de paquets pypi.org/project/psycopg2
Cette bibliothèque ne devrait-elle pas être importée dans AWS? Être utilisé dans AWS?
@HENROV J'ai exécuté ce script Python dans mon PC local en tant que client et connecté au cluster redshift via des informations d'identification, tout comme n'importe quel autre SGBD.
J'ai résolu la procédure qui supprime tous les enregistrements. En utilisant cette technique pour tronquer échouer, mais la suppression de cela fonctionne bien à mes fins et à mes fins.
create or replace procedure sp_truncate_dwh() as $$ DECLARE tables RECORD; BEGIN FOR tables in SELECT tablename FROM pg_tables WHERE schemaname = 'dwh' order by tablename LOOP EXECUTE 'delete from dwh.' || quote_ident(tables.tablename) ; END LOOP; RETURN; END; $$ LANGUAGE plpgsql; --call sp_truncate_dwh()
Les procédures de Redshift n'ont été disponibles que depuis le 17 mai 2019 aws.amazon.com/about-aws/whats-new/2019/05/... Pour que cela puisse être une solution intéressante en utilisant des procédures, je vais essayer d'essayer
En plus de la réponse de DEMIRCIOGLU, je devais ajouter de commettre après chaque instruction DROP pour laisser tomber toutes les tables de mon schéma. Sélectionnez 'Drop Table si existe' || Nom de la table || ' CASCADE; S'ENGAGER;' De pg_tables où Schemaname = '
SELECT 'DROP TABLE IF EXISTS ' || table_name || ' CASCADE;' FROM information_schema.tables WHERE table_schema = '<your_schema>' AND table_name LIKE '<%condition%>'
Salut! Alors que ce code peut résoudre la question, , y compris une explication de la manière et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de la qualité. de votre message et aboutit probablement à plus de votes. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement la personne qui demande maintenant. S'il vous plaît Modifier Votre réponse Pour ajouter des explications et donner une indication de quelles limitations et hypothèses s'appliquent.
C'est drôle, il suffit de copier une autre réponse avec quelques modifications de formatage.
Écrivez la boucle dans Python ou une autre langue de script, externe à votre cluster?