需要使用go lang

时间:2016-11-30 09:07:59

标签: arrays json postgresql go struct

我使用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 
    } 

结构很大,里面有一些json数组,我的数据库模式和struct一样。至于我研究插入的唯一方法是使用查询并从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 [])我将拥有certificateinfo结构的所有字段,您可以在上面的结构信息中看到。这里我将证书作为json []。我不知道哪一个更好的json或json []用于检索。 我将进行以下操作,如果可以使用PostgreSQL,我就不会这样做。

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

很抱歉这么精致。因为我刚刚在Postgres中使用json我有很多疑问。所以请承认我的无意识问题。谢谢...感谢你的帮助。谢谢

2 个答案:

答案 0 :(得分:3)

您可以使用https://github.com/jmoiron/sqlx库。它具有NamedExec功能,您可以将变量传递给它。但首先,您需要为每个struct field定义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)
}

答案 1 :(得分:0)

另一种方法是使用依赖于代码生成的github.com/knq/xo包(go tool generate)。

该软件包附带了一个工具,该工具采用目标数据库的模式,并创建一组Go源代码文件,其中包含映射到数据库模式(以及后面)的类型和代码。

github.com/jmoiron/sqlx相比,优点和缺点如下:

  • sqlx速度较慢,因为它依赖于您提交给它的值类型的运行时反映。 xo生成的静态代码在理论上可以达到最快,可以在繁重的工作负载下产生一些差异。
  • xo需要单独的生成步骤,而sqlx则不需要。
  • sqlx还允许您在类型上使用其他代码 - 因此您也可以拥有json序列化的代码。我不确定xo是否会尝试保留对其生成的更改。