pgx icon indicating copy to clipboard operation
pgx copied to clipboard

RowToStructByName, Lax and Pos not working with `db:"-"` tag

Open MiniJ147 opened this issue 1 year ago • 1 comments

pgx throwing "struct doesn't have corresponding row field " when attempting to use struct tag db:"-" with the following functions:

  • RowToStructByName
  • RowToStructByNameLax
  • RowToStructByPos

Code Im working with Model

// model
type AccountModel struct {
	SkId        uuid.UUID `db:"-"`
	SkUsername  string    `db:"username"`
	SkEmail     string    `db:"email"`
	SkCreatedAt time.Time `db:"created_at"`
	SkUpdatedAt time.Time `db:"updated_at"`
}

Postgres Table

CREATE TABLE "accounts" (
    id                      UUID PRIMARY KEY,
    username                VARCHAR(255) NOT NULL,
    email                   TEXT NOT NULL,
    created_at              TIMESTAMP NOT NULL,
    updated_at              TIMESTAMP NOT NULL
);

Queries used

// both queries were used in testing
queryv1 := `SELECT * FROM "accounts" WHERE id=$1 OR username=$2 OR email=$3`
queryv2 := `SELECT id,username,email,created_at,updated_at FROM "accounts" WHERE id=$1 OR username=$2 OR email=$3`

Code being ran

type storage struct {
     Conn *pgx.Conn
}

func (s *storage) Find(ctx context.Context, id uuid.UUID, email, username string) (AccountModel, error) {
	rows, err := s.Conn.Query(ctx, queryv1, id, username, email) // both queryv1 and queryv2 was tried here
	if err != nil {
		return AccountModel{}, err
	}
	// doesn't work with
	// RowToStructByName
	// RowToStructByNameLax
	// RowToStructByPos
	m, err := pgx.CollectOneRow(rows, pgx.RowToStructByName[AccountModel])
	if err != nil {
		return AccountModel{}, err
	}

	return m, nil
}

Error Message

"struct doesn't have corresponding row field id"

Expected behavior Should expect the id field to be excluded in the returned struct. When I include the id field it works and throws no error. I've looked through all previous error post opened and the solutions linked there have not worked.

Version

  • Go: go version go1.22.5 windows/amd64
  • PostgreSQL: PostgreSQL 16.1, compiled by Visual C++ build 1937, 64-bit
  • pgx: github.com/jackc/pgx/v5 v5.6.0

MiniJ147 avatar Jul 19 '24 19:07 MiniJ147

Your query returns a column "id" but you don't have anywhere to scan it. Every column returned from a query must have a destination for the RowToStruct* functions.

jackc avatar Jul 22 '24 22:07 jackc