
## SQL Builder

SQL Builder files are Go files, containing types necessary to write type safe SQL queries in Go. They are 
autogenerated from database tables and enums. File names is always snake case of the table or enum name.

### Table SQL Builder files

Following rules are applied to generate table SQL Builder files:

- for every table there is one Go SQL Builder file generated.  
- every file contains one type - struct with nested jet.Table.
- for every column of table there is a field column in SQL Builder table type. 
Field name is camel case of column name. See below table for type mapping.
- `AllColumns` is used as shorthand notation for list of all columns.
- `MutableColumns` are all columns minus primary key columns _(Useful in INSERT or UPDATE statements)_.

##### Mappings of database types to sql builder column types:

| Database type(postgres)                         | Sql builder column type                                            |
| ----------------------------------------------- | -------------------------------------------------- |
| boolean                                         |  ColumnBool                                        |
| smallint, integer, bigint                       |  ColumnInteger                                     |
| real, numeric, decimal, double precision        |  ColumnFloat                                       |
| date                                            |  ColumnDate                                        |
| timestamp without time zone                     |  ColumnTimestamp                                   |
| timestamp with time zone                        |  ColumnTimestampz                                  |
| time without time zone                          |  ColumnTime                                        |
| time with time zone                             |  ColumnTimez                                       |
| enums, text, character, character varying       |                                                    |
| bytea, uuid                                     |                                                    |
| and all remaining types                         |  ColumnString                                      |

### Example

Sql table `address`:
```
CREATE TABLE dvds.address
(
    address_id serial NOT NULL DEFAULT,
    address character varying(50) NOT NULL,
    address2 character varying(50),
    district character varying(20) NOT NULL,
    city_id smallint NOT NULL,
    postal_code character varying(10),
    phone character varying(20) NOT NULL,
    last_update timestamp without time zone NOT NULL DEFAULT now(),
    CONSTRAINT address_pkey PRIMARY KEY (address_id)
)
```

Part of the table sql builder file for table `address`. 

```
package table

import (
	"github.com/go-jet/jet"
)

var Address = newAddressTable()

type AddressTable struct {
	jet.Table

	//Columns
	AddressID  jet.ColumnInteger
	Address    jet.ColumnString
	Address2   jet.ColumnString
	District   jet.ColumnString
	CityID     jet.ColumnInteger
	PostalCode jet.ColumnString
	Phone      jet.ColumnString
	LastUpdate jet.ColumnTimestamp

	AllColumns     jet.ColumnList
	MutableColumns jet.ColumnList
}
```

### Enum SQL Builder files

Following rules are applied to generate enum SQL Builder files:

- for every enum there is one Go SQL Builder file generated.
- every file contains one type. Type name is a camel case of enum name.
- for every enum value there is a field in SQL Builder enum struct. Field name is camel case of enum value. Type is
jet.StringExpression, meaning it can be used by string expressions methods.

#### Example

Enum `mpaa_rating`:
```
CREATE TYPE dvds.mpaa_rating AS ENUM
    ('G', 'PG', 'PG-13', 'R', 'NC-17');
```

Enum SQL Builder file for `mpaa_rating`:
```
package enum

import "github.com/go-jet/jet"

var MpaaRating = &struct {
	G    jet.StringExpression
	PG   jet.StringExpression
	PG13 jet.StringExpression
	R    jet.StringExpression
	NC17 jet.StringExpression
}{
	G:    jet.NewEnumValue("G"),
	PG:   jet.NewEnumValue("PG"),
	PG13: jet.NewEnumValue("PG-13"),
	R:    jet.NewEnumValue("R"),
	NC17: jet.NewEnumValue("NC-17"),
}
```
