gpt4 book ai didi

postgresql - 如何防止从 SPA 创建对象时重复 id?还是我应该留在分贝?

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:42 25 4
gpt4 key购买 nike

我有一个 react 应用程序,它从 golang api 获取数据,该 api 从 postgres 数据库查询数据。我的一个模型是深度嵌套的 JSON,所以我在 postgres 中使用了 JSONB 数据类型。

CREATE table rules (
id serial primary key,
rule jsonb
);

在golang中,我有结构

type Rule struct {
ID int `json:"id"`
Name string `json:"name"`
...succeeding fields are deeply nested data
}

在 SPA 中我有模型

interface Rule {
id number
name string
....same as from the golang api model
}

为了在 SPA 中创建一个新的 Rule 对象,我将 0 分配给 id。新创建的规则被发送到 golang rest api。然后在 api 中,我首先向 postgres 数据库询问序列号的下一个值(使用 POSTGRES nextval),将获取的 ID 分配到规则结构 ID 字段中,

nextValidId := <result of nextval>
rule.ID = nextValidId

JSON 编码规则对象然后插入到数据库

ruleBytes, _ := json.Marshal(rule)
INSERT INTO rules_table VALUES (<nextValidId>, <ruleBytes>);

通过这种方式,我避免了在 SPA 处理 ID 生成时可能发生的重复 ID。但是,我发现我的方法已经有些复杂了。我知道我也可以从 SPA 生成 ID,但是如何在不使用上面使用的方法的情况下避免重复的 ID?还是我想太多了?

更新一:我还考虑过在没有 ID 字段的 golang 中添加另一个 Rule 结构,这样我就不必使用 nextval 只是为了将 id 放入 JSON 中,但它是吗一个好的编程设计有多个模型用于从数据库插入和检索以及另一个模型用于响应 SPA?

最佳答案

让数据库生成新的 ID,因为它正好是 SERIAL types are for in PostgreSQL .

在 golang 中,您可以插入一条新记录并使用 sql.DB.QueryRow(...) 检索生成的 ID和 .Scan() 使用 insert statement with a RETURNING clause ,例如:

var newId int
query := "INSERT INTO rules (rule) VALUES ($1) RETURNING id"
err := db.QueryRow(query, newRule).Scan(&newId)
// TODO: check err
log.Printf("newId=%d", newId)

关于postgresql - 如何防止从 SPA 创建对象时重复 id?还是我应该留在分贝?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52033926/

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