Column Mapping

The sqlr package obtains the column name and other information about a database column from the name and struct tag of the corresponding Go struct field.

Note: The examples in this section use the snake_case naming convention. The column names will change with a different naming convention, but the principles remain the same.

Simple structs

type User struct {
        ID        int64 `sql:"primary key"`
        Name      string
        UpdatedAt time.Time
        CreatedAt time.Time
}

// Column names generated by sqlr:
// * id
// * name
// * updated_at
// * created_at

Note the use of the struct tag to specify the primary key. The struct tag can also be used to override the column name:

type User struct {
        ID        int64     `sql:"user_id primary key"`
        Name      string
        UpdatedAt time.Time
        CreatedAt time.Time
        DOB       time.Time `sql:"date_of_birth"`
}

// Column names generated by sqlr:
// * user_id
// * name
// * updated_at
// * created_at
// * date_of_birth

If you need to override the column name to be an SQL keyword, (which is rarely a good idea), you can use quotes to specify the column name:

// Not recommended
type User struct {
        ID int64 `sql:"'primary' primary key"` // setting column name to SQL keyword
        // ... rest of struct here
}

Anonymous structs

Sometimes there are a set of common columns, used by each table. Anonymous structs provide a way to ensure consistency across the Go structs:

type Entity struct {
        ID        int64 `sql:"primary key autoincrement"`
        UpdatedAt time.Time
        CreatedAt time.Time
}

type User struct {
        Entity
        Name  string
        Email string
}

// Column names generated by sqlr:
// * id
// * updated_at
// * created_at
// * name
// * email

type Vehicle struct {
        Entity
        Make string
        Model string
}

// Column names generated by sqlr:
// * id
// * updated_at
// * created_at
// * make
// * model

Embedded structs

In some cases it is useful to use embedded structures when representing components in a structure:

type Address struct {
        Street   string
        Locality string
        City     string
        Postcode string
        Country  string
}

type CustomerContact struct {
        CustomerID    int64 `sql:"primary key"`
        HomeAddress   Address
        PostalAddress Address
}

// Column names generated by sqlr:
// * customer_id
// * home_address_street
// * home_address_locality
// * home_address_city
// * home_address_postcode
// * home_address_country
// * postal_address_street
// * postal_address_locality
// * postal_address_city
// * postal_address_postcode
// * postal_address_country

Go struct tags

The sqlr package inspects the Go struct tag with the sql tag key. The format of the tag key consists of an optional column name followed by keywords.

example column name primary key autoincrement
sql:”user_id primary key” user_id yes no
sql:”user_id” user_id no no
sql:”primary key” Use naming convention yes no
sql:”primary key autoincrement” Use naming convention yes yes
sql:“‘primary’ primary key” primary yes no
sql:” ‘key’ “ key no no

If first name in the tag column name is not one of the keywords it is interpreted to be a column name. In the rare (and inadvisable) situation where a column is required to be a keyword, it can be enclosed in single quotes (').

The full list of accepted keywords is:

keyword synonyms description
primary key pk, primary_key Column is the primary key, or part
of a composite primary key
autoincrement autoincr, identity Column is an auto-increment (aka identity) column
natural key natural_key Column is a natural key, or part of a composite
natural key: used in error messages to assist
in identifying the row
json jsonb Column is marshaled as JSON
null omitempty Empty value is stored in the DB as NULL,
NULL is scanned as empty value