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

时间:2018-08-08 07:45:36

标签: postgresql go sqlx

我在我的api中编写了用于与postgresql db交互的简单模型,除了一个表之外,其他所有模型都能正常工作。当我尝试运行测试时出现错误:

=== 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

但是,如果我从psql控制台运行相同的查询,则一切正常:

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

以下是AddUser函数和Users结构的代码:

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
}

此处是测试功能的代码:

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

这是用于创建用户表的查询:

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)

我想尝试执行此查询时,在AddUser函数中某处出错:插入用户(用户名,用户名)VALUES(:用户名,用户名)

编辑: 建立与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 个答案:

没有答案