psycopg2 psycopg2.InternalError зависимые объекты

Я использую peewee на heroku, но, согласно документации peewee, удаление связанных таблиц должно выполняться в коде.

Вопрос как?

У меня есть следующие модели

class WebPage(Model):
  title = CharField()

class Term(Model):
  name = CharField()

class WebPageTerms(Model):
  term = ForeignKeyField(Term)
  webpage = ForeignKeyField(WebPage)

Метод удаления таблицы, включающий пользовательский оператор postgresql:

def drop_tables():
   WebPage.drop_table(fail_silently=True)
   Term.drop_table(fail_silently=True)
   WebPageTerms.drop_table(fail_silently=True)

как часть развертывания я удаляю все таблицы и создаю их, чтобы добавить новые поля.

Я пробовал следующий подход, но он все еще не работает:

conn = psycopg2.connect("dbname='' user='' host='' password=''")
curr = conn.cursor()
curr.execute("DROP table webpageterms CASCADE")
curr.execute("DROP table webpage CASCADE")
curr.close()
conn.close()

но я продолжаю получать ту же ошибку

psycopg2.InternalError: невозможно удалить веб-страницу таблицы, поскольку от нее зависят другие объекты. ПОДРОБНЕЕ: ограничение webpageterms_webpage_id_fkey для терминов веб-страницы таблицы зависит от веб-страницы таблицы. СОВЕТ: используйте DROP ... CASCADE, чтобы также удалить зависимые объекты.

как я могу удалить эти таблицы?

** РЕДАКТИРОВАТЬ ** Пытался изменить код на:

curr.execute("ALTER TABLE webpageterms DROP CONSTRAINT webpageterms_webpage_id_fkey")

но я получаю:

psycopg2.InternalError: cannot drop table webpage because other objects depend on it
DETAIL:  constraint webpageterms_webpage_id_fkey on table webpageterms depends on table webpage
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

person kristian nissen    schedule 28.04.2013    source источник


Ответы (2)


Отбросьте их в таком порядке:

WebPageTerms.drop_table(fail_silently=True)
Term.drop_table(fail_silently=True)
WebPage.drop_table(fail_silently=True)

Peewee поставляется с помощником для удаления таблиц — он сортирует их топологически для вас по следующим внешним ключам:

from peewee import drop_model_tables
drop_model_tables([WebPage, Term, WebPageTerms])  # <-- will sort them correctly
person coleifer    schedule 30.04.2013

Попробуйте сначала удалить ограничения на внешние ключи:

ALTER TABLE "webpageterms" DROP CONSTRAINT "webpageterms_webpage_id_fkey"

и (хотя я не знаю точного имени внешнего ключа здесь, потому что его нет в списке)

ALTER TABLE "webpageterms" DROP CONSTRAINT "webpageterms_term_id_fkey"

person David McKeone    schedule 28.04.2013
comment
Отбрасывание ограничения решит проблему, но ее легче решить, отбрасывая их в другом порядке. - person coleifer; 30.04.2013