Web2py - 使用单独的SQL数据库进行归档时的密钥/约束问题

时间:2013-06-10 15:38:01

标签: python sql postgresql web2py

在web2py应用程序中,我有一个主postgresql数据库(db1),我已经设置了一个单独的postgresql数据库(db1_archive),用于存档db1中的几个表。此功能在具有以下内容的模块中实现:

class db_archives():

    def __init__(self, request, response, db1_archive, db1, auth):

        ...

        auth.enable_record_versioning(
            archive_db = db1_archive,
            tables = [db1.auth_user, db1.table1, db1.table2, ...]
            archive_names='archive_%(tablename)s'
            )

当从db1中的相关表中删除某些内容时,它应该自动存档在db1_archive中。但是,删除后,会生成以下psycopg2.IntegrityError:

  

表“archive_table1”上的插入或更新违反   外键约束“archive_table1_created_by_fkey”DETAIL:Key(created_by)=(9)是>表“auth_user”中没有出现

我想发生的事情是归档数据库没有找到ID为9的用户.'created_by'字段具有以下约束:

FOREIGN KEY (created_by) REFERENCES auth_user(id) ON DELETE CASCADE

我想从归档数据库中删除所有约束。我认为这可以通过web2py的[database_name].executesql()函数来完成。但是,我尝试了一些诸如db1_archive.executesql('SET FOREIGN_KEY_CHECKS=0;')之类的内容,但最终只出现了错误消息。谁能告诉我一些SQL或web2py代码,我可以尝试解决这个问题?感谢。

1 个答案:

答案 0 :(得分:1)

您需要做的是构建约束名称列表,然后在代码中遍历它们:

alter table [tablename] drop constraint [fkeyname];

如果您需要从系统目录中提取此信息,请参阅pg_constraint表。

请注意,alter table无法参数化,因此您必须将该命令组合为具有正确转义的字符串并运行它。