需要直接将结构体插入到PostgreSQL数据库中

5
我将使用Go语言作为后端,PostgreSQL作为数据库。我使用“github.com/lib/pq”驱动程序连接我的数据库。我有一个结构体,其中包含许多字段,并且其中包含一些JSON。
我的结构体看起来像这样:
ApplyLeave1 struct {
        LeaveId           int       
        EmpId             string    
        SupervisorEmpId   string    
        LeaveDays         float64   
        MDays             float64   
        LeaveType         string    
        DayType           string    
        LeaveFrom         time.Time 
        LeaveTo           time.Time 
        AppliedDate       time.Time 
        LeaveStatus       string    
        ResultDate        time.Time     
        Certificate       []*CertificateInfo
    }

    CertificateInfo struct {
        Id           int64  
        FileName     string 
        FileType     string 
        FileLocation string 
    } 

这个结构体很大,里面有一些json数组,并且我的数据库模式与结构体相同。就我所研究的,唯一的插入方式是使用查询,并将mystruct中的数据逐一插入到数据库中,例如像这样:

var leave ApplyLeave1

    db.Exec("INSERT INTO TABLENAME(leaveid,empid,supervisorid,....) VALUES($1,$2,$3,$4,....)",leave.LeaveId,leave.EmpId,leave.SupervisorId,.....)

由于我的结构非常大,因此写起来太长了。是否有可能一次性插入整个结构,请指导我如何在数据库中插入JSON数组。感谢任何帮助。谢谢。

更新信息:

CREATE TABLE IF NOT EXISTS apply_leave1 
(
    leaveid serial PRIMARY KEY NOT NULL ,
    empid varchar(10) NOT NULL REFERENCES employee(empid),
    leavedays double precision NOT NULL DEFAULT 0 ,
    mdays double precision NOT NULL DEFAULT 0 ,
    leavetype varchar(20) NOT NULL DEFAULT '' ,
    daytype text NOT NULL DEFAULT '',
    leavefrom timestamp with time zone NOT NULL,
    leaveto timestamp with time zone NOT NULL,
    applieddate timestamp with time zone NOT NULL,
    leavestatus varchar(15) NOT NULL DEFAULT ''  ,
    resultdate timestamp with time zone,
    certificatestatus bool NOT NULL DEFAULT FALSE,
    certificate json[])

在证书(json[])内部,我将拥有证书信息结构体中的所有字段,您可以在上面的结构体信息中查看。这里我将证书作为json[]提供。我不知道哪一个更好,是json还是json[]。

  • 我需要存储每次请假超过两张证书信息
  • 我希望以自增和唯一的证书id作为便于检索的标识符(因为我的请假id已经是主键和自增的了,我不知道是否可能)
  • 我将使用请假id和证书id搜索证书信息。
  • 我需要仅使用请假id和证书id检索某些证书信息字段。例如,仅使用文件名和文件类型。
  • 我需要使用其ID更新特定证书的证书信息。

很抱歉这么详细。由于我是第一次在Postgres中使用json,我有很多疑问。请谅解我的无知问题。非常感谢您的帮助。谢谢!

2个回答

11
你可以使用https://github.com/jmoiron/sqlx库。它有一个NamedExec函数,你可以向其中传递变量。但首先,你需要为每个结构体字段定义db标记。
简化示例:
import (
    _ "github.com/lib/pq"
    "github.com/jmoiron/sqlx"
    "log"
)

type ApplyLeave1 struct {
    LeaveId           int       `db:"leaveid"`
    EmpId             string    `db:"empid"`
    SupervisorEmpId   string    `db:"supervisorid"`
}

db, err := sqlx.Connect("postgres", "user=foo dbname=bar sslmode=disable")
if err != nil {
    log.Fatalln(err)
}

query := `INSERT INTO TABLENAME(leaveid, empid, supervisorid) 
          VALUES(:leaveid, :empid, :supervisorid)`

var leave1 ApplyLeave1
_, err := db.NamedExec(query, leave1)
if err != nil {
    log.Fatalln(err)
}

谢谢......您能告诉我如何保存JSON数组并使用sqlx检索它吗?在我的结构中,我需要存储证书信息...谢谢。 - Rajesh Kumar
@RajeshKumar,你想如何存储[]Certificateinfo?在PostgreSQL文本字段中作为JSON字符串还是在单独的表中?你需要详细说明你的表。 - Wendy Adi
我已更新我的信息以获取更多信息。很抱歉我讲得这么详细,因为我不熟悉PostgreSQL中的JSON。谢谢。 - Rajesh Kumar
我们可以在这里使用 sql.NullString 吗? - Pinser

2
另一种方法是使用github.com/knq/xo包,该包依赖于代码生成(go tool generate)。
该包附带一个工具,它接收目标数据库的模式,并创建一组包含类型和代码的Go源代码文件,这些类型和代码映射到DB模式(反之亦然)。
github.com/jmoiron/sqlx相比,它们各有优缺点:
  • sqlx速度较慢,因为它依赖于您提交给它的值的类型上的运行时反射。 xo 生成静态代码,理论上尽可能快,这在重负载下会产生一定差异。
  • xo需要单独的生成步骤,而sqlx则没有。
  • sqlx允许您还使用其他标签,例如json序列化标签。我不确定xo是否试图保留您对其生成内容所做的更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接