1

在 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”详细信息:键(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 代码?谢谢。

4

1 回答 1

1

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

alter table [tablename] drop constraint [fkeyname];

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

请注意,alter table 无法参数化,因此您必须将命令组装为带有适当转义的字符串并运行它。

于 2013-10-16T05:37:57.337 回答