需要直接插入结构后Qlesql db中



我将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数组,并且我的数据库架构与结构一样。至于我研究的唯一插入方法是使用查询并从mystruct中插入一个,例如这样的数据库

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

这太长了,因为我的结构很大。可以一次插入整个结构,请指导我如何插入json array 数据库内部。

更新的信息:

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 [])我将拥有上面的结构信息中可以看到的所有centerriinfo struct的字段。我不知道哪个是json或json []。我将进行以下操作,如果PostgreSql可以使用。

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

很抱歉如此精致。因为我是新手在Postgres中使用JSON,所以我有很多疑问。因此,请承担我的不知情问题。谢谢...感谢您的帮助。谢谢

您可以使用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)
}

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

此软件包带有一个工具,该工具采用了目标数据库的架构,并创建了一组GO源代码文件,其中包含类型和代码,将其映射到DB架构(和Back)。

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

  • sqlx的速度较慢,因为它依赖于您提交给它的值的类型运行时反射。xo生成静态代码,理论上可以得到尽可能快的速度,这可能会在繁重的工作量下有所作为。
  • xo需要一个单独的生成步骤,而sqlx则不需要。
  • sqlx允许您在类型上使用其他标签,因此,您也可能有json序列化的标签。我不确定xo是否试图将您对生成的更改保存。

最新更新