所以我需要在 aws rds 实例上的 postgres 中导入 django 固定装置(例如,本质上是 django 的数据库转储)。我已经在本地测试了数据库的约束都是有效的(通过在副本中本地导入)。然后我将fixture推送到aws django服务器,并使用django的loaddata函数加载它们,django会将它们推送到rds db。
为了加载这些夹具(因为许多模型的 fk 相互引用),我需要禁用 postgres 中的 fk 检查以加载数据。为此,我有一个脚本:
begin;
alter table foo_bar disable trigger all;
.... other tables same cmd ....
commit;
然后,我使用 enable 运行类似的命令列表来重新设置约束。
当我在我的副本中本地测试它时,它运行良好。但是,在 rds 上,当我尝试运行脚本(使用 Dbeaver 连接到数据库)时,出现此错误:
SQLERROR [42501]: permission denied: "RI_constrainttrigger_a_19346" is a system trigger.
我似乎明白这将是由于我当前的用户没有权限(在 rds postgres 实例上)执行该操作?
我的问题是:如何检查/更改 rds 实例的权限,以便我的 postgres 用户有权运行该命令?
PS:我对 postgres/rds 不是很了解,所以最好为可能不明显的事情提供一些背景知识。谢谢!
好的,所以问题是这只是错误的方法。@Laurenz Albe 似乎是对的——“对不起,戴夫,我恐怕做不到”。
那么dba要做什么呢?好吧,我个人的回答是:
设置同一数据库的本地实例。所以基本上对我来说,这是我在 docker 上使用 postgres 后端的 django 开发设置。
将您的固定装置上传到该位置。可以轻松地为此设置触发器,无论是基于每个表的表(如上所示),甚至使用
set session_replication_role = replica;
(有关信息,请参阅 postgres 文档),这更简单。或者,如果您不想在 postgres 上手动强制进行约束检查,您可以简单地在您的 django 模型中设置db_constraint=False
所有models.ForeignKey
,迁移,上传,然后再次设置为 True,迁移。一旦你在 postgres 上本地上传了固定装置/数据并验证了约束检查出来,生成一个数据转储:
这会产生完整的 pg 数据转储。
您应该确保表的本地所有者与远程所有者相同。因为这些是在上传时由转储文件设置的 (
ALTER TABLE your_table OWNER TO owner_name;
)。否则在上传之前查找 + 替换转储中的 owner_name。然后,上传到 rds:
您将被要求输入 postgres 用户密码。
然后它将全部运行在终端中的输出;我认为您可以使用 -L 标志将内容输出到本地日志文件(未经测试)。无论如何,看看输出,如果一切正常,你的数据就在那里。
警告:应该确保远程数据库与本地数据库相同(就模型而言)。我的目标只是首先填充一个空数据库。我猜在生产中,您首先要从远程 rds 实例中转储。将其上传到本地。然后上传额外的灯具。然后本地转储,远程上传。