2016-11-28 17 views
-4

Я использую GoLang в back-end и PostgreSQL в качестве базы данных. Я новичок в связях базы данных PostgreSQL с Go. Я использую Beego в качестве back-end. Я хочу создать таблицу с одним из полей типа JSON с использованием пакета Golang database/sql и lib/pq. То, что я делаюСоздать таблицу в Postgres с полем типа json с помощью GoLang

Это мой создать таблицу запроса

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. Я ценю любую помощь. Благодаря!

+0

Просьба упростить фрагмент кода или предоставить конкретную строку, которая вызывает ошибку. Мы не можем собрать все ваше приложение и отладить его. – I159

+0

И еще одна важная вещь - ваша ошибка не связана с sql или любыми libs, которые вы используете. Это просто неправильная операция указателя. – I159

+0

извините.Beginner на переполнение стека. Спасибо за ваш совет - I159. Изменил код, чтобы быть точным. Могу ли я знать, какой указатель является проблемой. Спасибо –

ответ

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) 

Вы пропустите DEFAULT для столбца 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 
} 

Кроме того, вы создаете соединение, а не закрываете его в конце функции.