107 lines
3.5 KiB
Markdown
107 lines
3.5 KiB
Markdown
|
||
Before we can write SQL queries in Go we have to generate necessary Go files.
|
||
To generate files we need running database instance containing already defined database schema.
|
||
|
||
This files can be generated in two ways:
|
||
|
||
#### 1) Generating from command line
|
||
|
||
Install jet to GOPATH bin folder. This will allow generating jet files from the command line.
|
||
|
||
```sh
|
||
go install github.com/go-jet/jet/cmd/jet
|
||
```
|
||
|
||
Make sure GOPATH bin folder is added to the PATH environment variable.
|
||
|
||
Test jet generator can be found in the PATH.
|
||
```sh
|
||
jet -h
|
||
Usage of jet:
|
||
-host string
|
||
Database host path (Example: localhost)
|
||
-port string
|
||
Database port
|
||
-user string
|
||
Database user
|
||
-password string
|
||
The user’s password
|
||
-dbname string
|
||
name of the database
|
||
-schema string
|
||
Database schema name. (default "public")
|
||
-path string
|
||
Destination dir for generated files.
|
||
-sslmode string
|
||
Whether or not to use SSL(optional) (default "disable")
|
||
-params string
|
||
Additional connection string parameters(optional)
|
||
```
|
||
|
||
To generate jet SQL Builder and Data Model files from postgres database we need to call `jet` generator with postgres
|
||
connection parameters and root destination folder path for generated files.
|
||
Assuming we are running local postgres database, with user `jet`, database `jetdb` and schema `dvds` we will use this command:
|
||
|
||
```sh
|
||
jet -host=localhost -port=5432 -user=jet -password=jet -dbname=jetdb -schema=dvds -path=./gen
|
||
```
|
||
```sh
|
||
Connecting to postgres database: host=localhost port=5432 user=jet password=jet dbname=jetdb sslmode=disable
|
||
Retrieving schema information...
|
||
FOUND 15 table(s), 1 enum(s)
|
||
Destination directory: ./gen/jetdb/dvds
|
||
Cleaning up schema destination directory...
|
||
Generating table sql builder files...
|
||
Generating table model files...
|
||
Generating enum sql builder files...
|
||
Generating enum model files...
|
||
Done
|
||
```
|
||
#### 2) Generating from code
|
||
|
||
The same files can be generated manually from code.
|
||
|
||
```
|
||
import "github.com/go-jet/jet/generator/postgres"
|
||
|
||
...
|
||
|
||
err = postgres.Generate("./gen", postgres.DBConnection{
|
||
Host: "localhost",
|
||
Port: "5432",
|
||
User: "jet",
|
||
Password: "jet",
|
||
DBName: "jetdb",
|
||
SchemaName: "dvds",
|
||
SslMode: "disable",
|
||
})
|
||
```
|
||
|
||
In both ways, generator will:
|
||
- connect to postgres database and retrieve information about the _tables_ and _enums_ of `dvds` schema
|
||
- delete everything in schema destination folder - `./gen/jetdb/dvds`,
|
||
- and finally generate sql builder and model files for each schema tables and enums.
|
||
|
||
Generated files folder structure will look like this:
|
||
```
|
||
|-- gen # destination folder
|
||
| `-- jetdb # database name
|
||
| `-- dvds # schema name
|
||
| |-- enum # sql builder folder for enums
|
||
| | |-- mpaa_rating.go
|
||
| |-- table # sql builder folder for tables
|
||
| |-- actor.go
|
||
| |-- address.go
|
||
| |-- film.go
|
||
...
|
||
| |-- model # Plain Old Data for every enum and table
|
||
| | |-- actor.go
|
||
| | |-- address.go
|
||
| | |-- film.go
|
||
...
|
||
|
||
```
|
||
|
||
Table and enums from database schema are used as a template to generate two types of Go files:
|
||
* SQL Builder files - used to write type safe SQL statements in Go (`enum` and `table` package)
|
||
* Model files - used to combine and store result from database queries (`model` package)
|