登录
首页 >  Golang >  Go问答

如何防止从 SPA 创建对象时出现重复的 id?或者我应该留在数据库中?

来源:stackoverflow

时间:2024-04-29 09:18:36 440浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《如何防止从 SPA 创建对象时出现重复的 id?或者我应该留在数据库中?》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有一个 react 应用程序,它从 golang api 获取数据,而 golang 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 数据库询问序列 id 的下一个值(使用 postgres nextval),将获取的 id 分配到规则结构 id 字段中,

nextvalidid := <result of nextval>
rule.id = nextvalidid

json 编组规则对象然后插入到数据库

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

这样我就避免了重复的 id,如果 spa 正在处理 id 生成,则可能会出现重复的 id。然而,我发现我的方法已经有些复杂了。我知道我也可以从 spa 生成 id,但是如何在不使用上面使用的方法的情况下避免重复的 id?还是我想太多了?

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


解决方案


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

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

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)

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>