GORM:通用方式的crud操作符

Posted

技术标签:

【中文标题】GORM:通用方式的crud操作符【英文标题】:GORM : crud operators in generic way 【发布时间】:2020-06-28 20:48:40 【问题描述】:

我尝试制作一个 Go DAL,为此我主要使用 GORM。

现在我尝试使我的 DAL 尽可能抽象,以便能够查询许多表。

问题是我必须为每个表结构重复自己 - 我的数据库的反射。

举个例子:

这是两个结构,一个用于我数据库中的每个表:

type Cad_check_status struct 
    Id int
    Status_code int
    Last_update Timestamp
    Path string
    Ref_num int
    System_code int


type Cad_check_errors struct 
    Id int
    check_status int
    error_code Timestamp

这里是它们各自的检索函数(每个一个,即使它们完全一样,除了结构实例化是这里的主要问题):

func StatusRetrieve(db *CDb, keyval map[string]interface) ([]byte, error)
    atts :=  []Cad_check_status // <===== this is my problem, the only difference between the two functions
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil 
        return nil, err
    
    b, _ := json.Marshal(atts)
    return b, nil
  

func ErrorsRetrieve(db *CDb, keyval map[string]interface) ([]byte, error)
    atts :=  []Cad_check_errors // <=== my problem again, the rest is the same
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil 
        return nil, err
    
    b, _ := json.Marshal(atts)
    return b, nil

到目前为止,我试图做这样的事情:

func Retrieve (tableStruct interface, db *CDb, keyval map[string]interface)([]byte, error) 
    atts :=  []tableStruct //<=== but of course this is IMPOSSIBLE ! but you got the idea....
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil 
        return nil, err
    
    b, _ := json.Marshal(atts)
    return b, nil

【问题讨论】:

“低打字”和“高打字”是什么意思?我以前从未听说过这些术语。 @Flimzy 抱歉,这是一个字面翻译(母语)的错误:想要用英语使用的正确术语是:静态类型与动态类型 啊,有道理。感谢您的澄清:) 【参考方案1】:

实际上,如果您正确使用,您的最后一个示例就可以正常工作:

func Retrieve (atts interface, db *CDb, keyval map[string]interface)([]byte, error) 
    errors := db.Where(keyval).Find(atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil 
        return nil, err
    
    b, _ := json.Marshal(atts)
    return b, nil


var values []Cad_check_status
json,err := Retrieve(&values, db, keyval)

【讨论】:

以上是关于GORM:通用方式的crud操作符的主要内容,如果未能解决你的问题,请参考以下文章

kratos学习从零使用kratos创建一个CRUD的demo,是gorm做数据库操作,经过几天研究,调试代码开源放到github上,还是非常方便的。服务也实现了CRUD的http接口。

kratos学习从零使用kratos创建一个CRUD的demo,是gorm做数据库操作,经过几天研究,调试代码开源放到github上,还是非常方便的。服务也实现了CRUD的http接口。

Mybatis-Plus:通用CRUD操作

Mybatis-Plus:通用CRUD操作

Mybatis-Plus:通用CRUD操作

Gorm框架学习---CRUD接口之创建