golang: sqlx: в одном случае нужен db:"user_id" в другом db:"userId"

Есть такой код:

type UserToRoleToCRM struct {
    Id       string
    UserId   string    `db:"user_id"`
    CRMId    string    `db:"crm_id"`
    RoleId   string    `db:"role_id"`
}

func TestField(t *testing.T) {
    ctx := context.Background()
    con := fmt.Sprintf(
        "host=%s user=%s password=%s dbname=%s port=%s sslmode=disable TimeZone=Europe/Moscow",
        os.Getenv("POSTGRES_HOST"),
        os.Getenv("POSTGRES_USER"),
        os.Getenv("POSTGRES_PASSWORD"),
        os.Getenv("POSTGRES_DB"),
        os.Getenv("POSTGRES_PORT_EXTERNAL"))
    connect, _ := sqlx.Connect("pgx", con)
    defer database.Clean(t, "user_to_role_to_crm", connect)

    e := entity.UserToRoleToCRM{
        Id:     uuid.New().String(),
        UserId: uuid.New().String(),
        CRMId:  uuid.New().String(),
        RoleId: uuid.New().String(),
    }
    dsn := "INSERT INTO user_to_role_to_crm (id, user_id, crm_id, role_id) VALUES (:id, :userId, :crmId, :roleId)"
    _, err := connect.NamedExecContext(ctx, dsn, &e)
    assert.Nil(t, err)
    eT := entity.UserToRoleToCRM{}
    err = connect.GetContext(ctx, &eT, "SELECT * FROM user_to_role_to_crm WHERE id = $1", e.Id)
    assert.Nil(t, err)
}

Если я пишу `db:"user_id"` выдает ошибку

Error:          Expected nil, but got: &errors.errorString{s:"could not find name userId in &entity.UserToRoleToCRM{Id:\"a0caf511-193a-4b51-8b12-4b63ba64aaa7\", UserId:\"645fb689-1994-4387-a04c-605bdc69d01d\", CRMId:\"f32f27af-ed96-4ade-950a-cfa49ce84701\", RoleId:\"7929bad0-1aaa-42f1-88fe-dabfc55792b4\", CreateAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC), UpdateAt:time.Date(1, time.January, 1, 0, 0, 0, 0, time.UTC)}"}

в строке _, err := connect.NamedExecContext(ctx, dsn, &e)

Если я пишу `db:"userId"` выдает ошибку

Error:          Expected nil, but got: &errors.errorString{s:"missing destination name user_id in *entity.UserToRoleToCRM"}

в строке err = connect.GetContext(ctx, &eT, "SELECT * FROM user_to_role_to_crm WHERE id = $1", e.Id)

Как правильно настроить нейминг стратегию sqlx?


Ответы (1 шт):

Автор решения: Роман

нужно поправить запрос "INSERT INTO user_to_role_to_crm (id, user_id, crm_id, role_id) VALUES (:id, :user_id, :crm_id, :role_id)"


UDP: В запросе нужно было вместо :userId писать :user_id

→ Ссылка