【问题标题】:Create table in Postgres with json type field using GoLang使用 GoLang 在 Postgres 中创建带有 json 类型字段的表
【发布时间】:2017-04-11 21:13:15
【问题描述】:

我在后端使用 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()
    }

}

这是给我以下错误

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

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

【问题讨论】:

  • 请简化您的代码 sn-p 或提供引发错误的具体行。我们无法构建您的所有应用程序并对其进行调试。
  • 还有一件更重要的事情 - 您的错误与 sql 或您使用的任何库无关。这只是一个错误的指针操作。
  • sorry.Beginner 堆栈溢出。感谢您的建议 - I159。编辑代码以使其准确。我可以知道哪个指针是问题。谢谢
  • 没关系,看stackoverflow上的教程“如何提问”即可。我会尽力帮助你的。
  • 请指定因上述错误而崩溃的行。

标签: database postgresql go beego


【解决方案1】:

我认为你的问题是用于创建表的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)

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

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

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

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2020-12-16
    • 2015-03-27
    • 2016-05-15
    • 2016-01-14
    • 2022-11-13
    • 2018-11-07
    • 2013-07-22
    • 1970-01-01
    相关资源
    最近更新 更多