Django PostgreSQL - удалить все таблицы? - PullRequest
3 голосов
/ 23 июля 2010

Вот как я могу это сделать, когда MySQL является бэкэндом,

    cursor.execute('show tables')
    rows = cursor.fetchall()
    for row in rows:
        cursor.execute('drop table %s; ' % row[0]) 

Но как мне это сделать, когда postgresql является бэкэндом?

Ответы [ 5 ]

3 голосов
/ 23 июля 2010
    cursor.execute("""SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type != 'VIEW' AND table_name NOT LIKE 'pg_ts_%%'""")
    rows = cursor.fetchall()
    for row in rows:
        try:
            cursor.execute('drop table %s cascade ' % row[0])
            print "dropping %s" % row[0]
        except:
            print "couldn't drop %s" % row[0]

Предоставлено http://www.siafoo.net/snippet/85

3 голосов
/ 23 июля 2010

Вы можете использовать select * from pg_tables; получить список таблиц, хотя вы, вероятно, хотите исключить where schemaname <> 'pg_catalog' ...

Основываясь на другом из ваших недавних вопросов, если вы пытаетесь просто отбросить все свои вещи с django, но у вас нет разрешения на удаление БД, вы можете просто УДАЛИТЬ СХЕМУ , что Django есть все?

Также на свой счет, используйте CASCADE .

РЕДАКТИРОВАТЬ: Можете ли вы select * from information_schema.tables;?

РЕДАКТИРОВАТЬ: ваш столбец должен быть row[2] вместо row[0], и вам нужно указать, на какую схему смотреть с предложением WHERE schemaname = 'my_django_schema_here'.

РЕДАКТИРОВАТЬ: Или просто SELECT table_name from pg_tables where schemaname = 'my_django_schema_here'; и row[0]

2 голосов
/ 08 февраля 2012

В документации сказано, что ./manage.py sqlclear Печатает операторы DROP TABLE SQL для заданных имен приложений.

1 голос
/ 19 марта 2015

Я использую этот скрипт для очистки таблиц, я поместил его в скрипт с именем phoenixdb.sh, потому что он сжигает БД, а новый восстает из пепла. Я использую это, чтобы предотвратить множество миграций в ранней части проекта.

set -e
python manage.py dbshell <<EOF
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
EOF

python manage.py migrate

Это стирает таблицы из БД без удаления БД. Вашему пользователю Django потребуется собственная схема, которую вы можете настроить с помощью:

alter schema public owner to django-db-user-name; 

И вы также можете изменить владельца базы данных

alter database django-db-name owner to django-db-user-name;
0 голосов
/ 23 июля 2010

\dt - эквивалентная команда в postgres для вывода списка таблиц.Каждая строка будет содержать значения для (schema, Name, Type, Owner), поэтому вы должны использовать второе (row[1]) значение.

В любом случае, ваше решение сломается (в MySQL и PostgreSQL), когда будут задействованы ограничения внешнего ключа, и если их нет, у вас могут возникнуть проблемы с последовательностями.Поэтому, на мой взгляд, лучший способ - просто отбросить всю базу данных и снова вызвать initdb (что также является более эффективным решением).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...