jet/wiki/SQL-Builder.md

118 lines
4.1 KiB
Markdown
Raw Normal View History

2019-07-04 19:10:31 +02:00
## 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.
### 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. File name is in snake case of the table name.
- every file contains one type - struct with nested jet.Table. Type name is a camel case of table name.
- 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. File name is in snake case of the enum name.
- 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"),
}
```