gpt4 book ai didi

Django Save Object 基于PK 和另一个字段

转载 作者:行者123 更新时间:2023-11-29 12:21:33 25 4
gpt4 key购买 nike

我正在尝试将 postgresql 中的分区表与 Django 安装一起使用。

Google了一下这个主题,发现Django本身不支持分区,所以我自己对表进行了分区。我根据第二个字段对我的表进行分区,该字段是另一个表上的外键。基本模型设置如下:

class Event(models.Model):
id = models.AutoField(primary_key=True)
device = models.ForeignKey("Device")
... (More Fields)

我已经按 device_id 对表进行了分区,生成了 event_1、event_2 等子表。我所有的查询都包含设备 ID,所以查询现在快多了,但是对于插入,django 会生成一个 UPDATE 语句,例如:

UPDATE event SET device=X, ...=X, ... WHERE id=XXX

这导致数据库遍历表的所有分区以查找指定的 ID。由于 device_id 永远不会改变,我现在想将 device_id=XXX 语句添加到 UPDATE 语句的 WHERE 部分,这将允许数据库只遍历一个分区。

我认为我的问题只是问题的结果,我的数据库的主键中没有分区键,但是由于django只支持一个字段作为PK并且分区键不是唯一的,我不能用它来PK。

对于我的问题,我可以想到两种解决方案:

  1. 使用以某种方式自动构造的主键字段来自越来越多的数字与 device_id(如 1_234)相结合。然后数据库必须拆分主键才能知道哪个此事件针对的设备以及它需要在哪个分区中搜索。
  2. 更改 UPDATE 语句,将 device_id 添加到 WHERE 语句。

在我看来,最优雅的方式是将 device_id 包含在主键中。因此,不需要对 Django 进行任何更改,分区只会在对 Django 透明的数据库中发生。但是我不确定是否可以在数据库中创建这样的主键。

谢谢你的帮助

最佳答案

我同意您最好不要使用 Django。虽然我从来没有做过完全像这样的事情,但我认为创建一个插入前触发器来构造新的串联主键会非常容易。像这样:

CREATE TABLE foo(
id TEXT NOT NULL,
device_id INT NOT NULL,
CONSTRAINT foo_pkey PRIMARY KEY (id)
);

CREATE SEQUENCE foo_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;

CREATE OR REPLACE FUNCTION generate_foo_id()
RETURNS trigger AS
$BODY$
BEGIN
NEW.id := NEW.device_id || '_' || nextval('foo_id_seq');
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

CREATE TRIGGER trigger_generate_foo_id
BEFORE INSERT
ON foo
FOR EACH ROW
EXECUTE PROCEDURE generate_foo_id();

你是对的,你的分区函数将不得不拆分它。我从未创建过执行此操作的分区函数,但我不知道为什么它不起作用。但是,您应该使用您的结果测试并为此“答案”添加评论(以便 future 的用户将从您的测试中受益)。

关于Django Save Object 基于PK 和另一个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19706043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com