我使用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,我就不会这样做。
很抱歉这么精致。因为我刚刚在Postgres中使用json我有很多疑问。所以请承认我的无意识问题。谢谢...感谢你的帮助。谢谢
答案 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
是否会尝试保留对其生成的更改。