psycopg2 psycopg2.InternalError依赖对象

时间:2013-04-28 08:45:00

标签: python postgresql psycopg2

我在heroku上使用peewee,但根据peewee docs,删除相关表必须在代码中完成。

问题是怎么回事?

我有以下型号

class WebPage(Model):
  title = CharField()

class Term(Model):
  name = CharField()

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

包含postgresql自定义语句的drop table方法:

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:无法删除表格网页,因为其他   对象依赖于它DETAIL:约束webpageterms_webpage_id_fkey   表webpageterms取决于表网页提示:使用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.

2 个答案:

答案 0 :(得分:1)

按此顺序删除它们:

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

答案 1 :(得分:0)

首先尝试删除外键上的约束:

  

ALTER TABLE "webpageterms" DROP CONSTRAINT "webpageterms_webpage_id_fkey"

和(虽然我不知道外键的确切名称,因为它没有列出)

  

ALTER TABLE "webpageterms" DROP CONSTRAINT "webpageterms_term_id_fkey"