Удалить все таблицы в схеме Redshift (без удаления разрешений) - PullRequest
0 голосов
/ 26 марта 2019

Мне было бы интересно удалить все таблицы в схеме Redshift.Хотя это решение работает

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

, НЕ хорошо для меня, поскольку оно также отбрасывает разрешения SCHEMA.

Решение, подобное

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 $$;

, как сообщается в этой теме Как я могу отбросить все таблицы в базе данных PostgreSQL? было бы идеально.К сожалению, он не работает в Redshift (очевидно, нет поддержки for loops).

Есть ли какое-либо другое решение для достижения этой цели?

Ответы [ 3 ]

3 голосов
/ 26 марта 2019

Запустите этот SQL и скопируйте + вставьте результат на ваш клиент SQL.Если вы хотите сделать это программно, вам нужно построить вокруг него немного кода.

SELECT 'DROP TABLE IF EXISTS ' || tablename || ' CASCADE;' FROM pg_tables WHERE schemaname = '<your_schema>'
0 голосов
/ 17 июня 2019

Я решил это с помощью процедуры, которая удаляет все записи.Использование этой техники для усечения не дает результатов, но удаление ее отлично подходит для моих намерений и целей.

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()
0 голосов
/ 28 марта 2019

Использование Python и pyscopg2 Я придумал этот скрипт, чтобы удалить все таблицы в schema:

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()

Правильно заменить значения для DB_NAME, DB_PORT, DB_HOST, DB_USER и DB_PWD для подключения к Redshift DB

...