Django,Sqlalchemy:无法删除表 ganalytics_article,因为其他对象依赖于它

Posted

技术标签:

【中文标题】Django,Sqlalchemy:无法删除表 ganalytics_article,因为其他对象依赖于它【英文标题】:Django, Sqlalchemy: Cannot drop table ganalytics_article because other objects depend on it 【发布时间】:2020-12-27 17:33:20 【问题描述】:

我的 Django ganalytics 应用程序中有这个模型:

class Article(models.Model):
        id = models.IntegerField(unique=True, primary_key=True)
        article_title = models.CharField(max_length=250)
        article_url = models.URLField(max_length=250)
        article_pub_date = models.DateField()
    

class Company(models.Model):
    company_name = models.CharField(max_length=250)


class Author(models.Model):
    author_sf_id = models.CharField(max_length=20, null=True)
    author_name = models.CharField(max_length=250)

  
class AuthorArticleCompany(models.Model):
    author = models.ForeignKey(Author,
                               to_field="id",
                               on_delete=models.CASCADE,
                               related_name='authorarticle_author_id')
    company = models.ForeignKey(Company,
                                to_field="id",
                                on_delete=models.CASCADE,
                                related_name='authorarticle_company_id')
    article = models.ForeignKey(Article,
                                to_field="id",
                                on_delete=models.CASCADE,
                                related_name='authorarticle_article_id')

   


class Ganalytics(models.Model):
    article = models.ForeignKey(Article,
                                on_delete=models.CASCADE,
                                related_name='ganalytics_author_id')
    totalview = models.IntegerField()
    totalinteractions = models.IntegerField()

   


class Unsubscribers(models.Model):
    email = models.EmailField()
    reasonwhy = models.CharField(max_length=90)

    

我正在运行 pandas to_sql 来上传数据库:

authorarticlecompanydf.to_sql("ganalytics_authorarticlecompany", con=engine, if_exists="append", index=False)
articledf.to_sql("ganalytics_article",con=engine,if_exists="replace",index=False)
company_name.to_sql("ganalytics_company",con=engine,if_exists="replace",index=False)
authordf.to_sql("ganalytics_author", con=engine,if_exists="replace", index=False)

我收到此错误消息:

DETAIL:  constraint ganalytics_ganalytic_article_id_d37f2464_fk_ganalytic on table ganalytics_ganalytics depends on table ganalytics_article
constraint ganalytics_authorart_article_id_7f4ff374_fk_ganalytic on table ganalytics_authorarticlecompany depends on table ganalytics_article
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

[SQL: 
DROP TABLE ganalytics_article]

我尝试将on_delete 字段更改为不同的值,但它无济于事。 我做错了什么?

【问题讨论】:

【参考方案1】:

您正在运行什么命令来获取错误?底线是 Ganalytics 取决于 Article 通过它们之间的 FK。通过首先删除Article,您正在打破这种依赖关系。您需要先DROPGanalytics,然后再Article,或者按照提示DROP ... CASCADE。虽然请注意DROP Ganalytics 也会。

更新

另一种选择是在两个表之间删除 FK。那么你就不会有依赖问题了。

【讨论】:

抱歉更新@Adrian,我正在使用 Pandas 进行上传。我只是更新问题 好吧,根据您的代码,它应该只是附加记录。该错误表示它正在尝试DROP ganalytics_article,所以有些事情发生了。我会跟踪 Postgres 日志以查看实际发生的情况。 我的错。我是if_exists="replace" 这就是问题所在。您正在删除 ganalytics_articleganalytics_ganaltics 仍然存在并依赖于它。我在to_sql 中看不到任何可以让您覆盖它的内容。您将不得不手动执行此操作。要么删除 ganalytics_ganaltics 并稍后重新填充它,要么手动 TRUNCATE ganalytics_article` 并使用 if_exists='replace' 我的愚蠢,应该是if_exists='append'

以上是关于Django,Sqlalchemy:无法删除表 ganalytics_article,因为其他对象依赖于它的主要内容,如果未能解决你的问题,请参考以下文章

无法删除表,因为其他对象依赖于它

SQLAlchemy 比 Django 自带的 ORM 好在哪里

sqlalchemy 创建表

sqlalchemy:从联结表中删除项目

使用 SQLAlchemy 从反射表中删除的行

SQLAlchemy:在多表多态中删除