需要使用go lang在PostgreSQL内部直接插入struct

Raj*_*mar 2 arrays postgresql json struct go

我将go lang用作后端,将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 
    } 
Run Code Online (Sandbox Code Playgroud)

该结构很大,内部有一些json数组,我的数据库架构与该结构相同。至于我研究的唯一插入方法是使用查询并从mystruct逐个插入到数据库中,例如这样

var leave ApplyLeave1

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

因为我的结构很大,所以写的时间太长了,是否可以一次插入整个结构,请指导我如何在数据库中插入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[])
Run Code Online (Sandbox Code Playgroud)

在certificate(json [])内部,我将拥有您可以在上面的结构信息中看到的certificateinfo结构的所有字段。在这里,我将证书指定为json []。我不知道哪个是更好的json或json []进行检索。我将执行以下操作,而如果使用PostgreSQL,我将无法进行。

  • 每个休假我需要存储两个以上的证书信息
  • 我想给证书ID作为自动增量,并且唯一,因此很容易检索(我不知道是否可能,因为我的请假ID是主键和自动增量。
  • 我将使用请假ID和证书ID搜索证书信息。
  • 我只需要检索证书信息的某些字段,例如仅使用假ID和证书ID的文件名和文件类型。
  • 我需要使用其ID更新特定证书的证书信息。

很抱歉,这么复杂。自从我在Postgres中使用json以来,我一直有很多疑问。所以请忍受我的意识不足的问题。谢谢...感谢您的帮助。

Wen*_*Adi 5

您可以使用https://github.com/jmoiron/sqlx库。它具有NamedExec功能,您可以将变量传递给它。但是首先,您需要db为每个struct字段定义标记。

简化示例:

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)
}
Run Code Online (Sandbox Code Playgroud)