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

标签 database postgresql go beego

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

这是我的建表查询

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()
    }

}

这会抛出以下错误

Handler crashed with error runtime error: invalid memory address or nil pointer dereference

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

最佳答案

我认为你的问题是建表的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
}

此外,您正在创建一个连接,而不是在函数结束时关闭它。

关于database - 使用 GoLang 在 Postgres 中使用 json 类型字段创建表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40839370/

相关文章:

sql - 是否可以在 Postgres 中仅在 2 列之一发生冲突时插入?

algorithm - 如何找到 PostgreSQL 存储删除算法?

pointers - Go中的BigInt指针

sql - 如何从sql执行windows批处理命令?

php - CodeIgniter 加载数据库错误

mysql - 一般事情开发人员必须知道有 2 年以上的经验?

java - 使用 JPA 和 Hibernate 将 Java boolean 值映射到 Oracle Number 列

sql - 为什么 union 不能与 with 语句一起使用?

go - slice 类型的初始化方法初始化失败

go - nil不会将数据库记录设置为NULL