使用GoLang在Postgres中使用json类型字段创建表

时间:2016-11-28 07:47:51

标签: database postgresql go beego

我在后端使用GoLang,在PostgreSQL中使用数据库。我是Go的PostgreSQL数据库连接的新手。我使用Beego作为后端。我想使用Golang database/sql包和lib/pq创建一个包含JSON类型字段的表。那就是我做的事情

这是我的创建表查询

createtable:= `CREATE TABLE apply_leave1 (
                leaveid serial PRIMARY KEY NOT NULL ,
                empid varchar(10) NOT NULL ,
                leavedays double precision NOT NULL DEFAULT 0 ,
                mdays double precision NOT NULL DEFAULT 0 ,
                leavetype varchar(20) NOT NULL DEFAULT '' ,
                daytype text NOT NULL '',
                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 NULL)`



    conn := fmt.Sprintf(
        "user=%s password=%s dbname=%s sslmode=disable",
        "postgres",
        "root",
        "employee")
    log.Println("Creating a new connection: %v", conn)

    db, err := sql.Open("postgres", conn)

    stmt, err1 := db.Prepare(createtable)

    defer stmt.Close()
    _, err = stmt.Exec()
    if err != nil {
        fmt.Println(err.Error()
    }

}

这给我发了以下错误

  

处理程序因错误运行时错误而崩溃:无效的内存地址或无指针取消引用

但是当我使用查询从表中选择某些内容时,表创建查询或其他已执行的sql代码没有问题。我感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为你的问题是用于创建表的无效sql,应该是:

CREATE TABLE apply_leave1 (
    leaveid serial PRIMARY KEY NOT NULL ,
    empid varchar(10) NOT NULL ,
    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 NULL)

您错过了daytype列的DEFAULT。此外,您没有正确捕获错误,因为func leave()可以在发送响应之前完全执行。发现错误时,您可以使用return

db, err := sql.Open("postgres", conn)
if err != nil {
    fmt.Println(err.Error())
    e.Data["json"] = err.Error()
    e.ServeJSON()
    return
}

此外,您正在创建一个连接,而不是在func的末尾关闭它。