douguan8940 2018-08-08 07:45
浏览 242

PostgreSQL:从代码执行查询时,“ pq:关系列不存在”,但在控制台中工作正常

I'm writing simple models for interacting with postgresql db in my api, and all of them work fine except one table. When i try to run tests i get an error:

=== RUN   TestAddUser
time="2018-08-08T10:24:56+03:00" level=info msg="db connection" db: ="&{0xc4200c6dc0 postgres false 0xc4200912c0}"
--- FAIL: TestAddUser (0.00s)
    require.go:794: 
            Error Trace:    users_test.go:19
            Error:          Received unexpected error:
                            pq: column "user_name" of relation "users" does not exist
                            Error while trying to add new user
                            gitlab.com/inn4sci-go/Nesterenko/course/api/models.AddUser
                                /home/nestor/go/src/gitlab.com/inn4sci-go/Nesterenko/course/api/models/users.go:20
                            gitlab.com/inn4sci-go/Nesterenko/course/api/models/tests.TestAddUser
                                /home/nestor/go/src/gitlab.com/inn4sci-go/Nesterenko/course/api/models/tests/users_test.go:18
                            testing.tRunner
                                /usr/local/go/src/testing/testing.go:777
                            runtime.goexit
                                /usr/local/go/src/runtime/asm_amd64.s:2361
            Test:           TestAddUser
FAIL

Process finished with exit code 1

But if i run same query from psql console all works fine:

nestor=> INSERT INTO users (user_name, user_pass) VALUES ('wrerw','wrwer');
INSERT 0 1
nestor=>

Here the code of AddUser func and Users struct:

package models

import (
    "github.com/pkg/errors"
    "gitlab.com/inn4sci-go/Nesterenko/course/api/db"
)

type Users struct {
    Id        int    `db:"id" json:"id"`
    ProfileId int    `db:"profile_id" json:"profileId"`
    UserName  string `db:"user_name" json:"nickname"`
    UserPass  string `db:"user_pass" json:"password"`
}

func AddUser(db db.DbInt, user Users) (int64, error) {
    query := `INSERT INTO users (user_name, user_pass) VALUES (:user_name, :user_pass)`

    res, err := db.GetDB().NamedExec(query, &user)
    if err != nil {
        return 0, errors.Wrap(err, "Error while trying to add new user")
    }

    id, err := res.LastInsertId()
    if err != nil {
        return 0, errors.Wrap(err, "Error while trying to obtain userId")
    }

    return id, nil
}

Here code of test func:

func TestAddUser(t *testing.T) {
    mockDB := testutils.CreateFakeDBObj(t) //this func mocks db connection, and works fine in all test
    user := models.Users{
        UserName: "test",
        UserPass: "test",
    }

    userId, err := models.AddUser(mockDB, user)
    require.NoError(t, err)

    logrus.WithField("User was successfully added with id = ", userId).Info("Users test")
}

And this is query for creating users table:

nestor=> CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY, profile_id INTEGER REFERENCES profile(id), user_name TEXT UNIQUE NOT NULL, user_pass TEXT NOT NULL);
CREATE TABLE
nestor=> \dt users
       List of relations
 Schema | Name  | Type  | Owner 
--------+-------+-------+-------
 public | users | table | ihor
(1 row)

I suppose that i have got a mistake somewhere in AddUser func when trying to execute this query: INSERT INTO users (user_name, user_pass) VALUES (:user_name, :user_pass)

EDITED: Establishing connection to db:

type MockingDBObj struct {
    mock.Mock
}

func (m MockingDBObj) ConnectToDB(c configure.ConfigInt) error {
    return nil
}

func (m MockingDBObj) GetDB() *sqlx.DB {
    args := m.Called()
    return args.Get(0).(*sqlx.DB)
}
func CreateFakeDBObj(t *testing.T) MockingDBObj {
    mockObj := new(MockingDBObj)

    host := "localhost"
    port := 5432
    user := "ihor"
    password := "ihor"
    dbname := "final_project"

    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
        "password=%s dbname=%s sslmode=disable",
        host, port, user, password, dbname)

    db, err := sqlx.Connect("postgres", psqlInfo)
    require.NoError(t, err)
    logrus.WithField("db: ", db).Info("db connection")
    mockObj.On("GetDB").Return(db)

    return *mockObj
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥50 成都蓉城足球俱乐部小程序抢票
    • ¥15 yolov7训练自己的数据集
    • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
    • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
    • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
    • ¥20 matlab yalmip kkt 双层优化问题
    • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
    • ¥88 实在没有想法,需要个思路
    • ¥15 MATLAB报错输入参数太多
    • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件