Documentation
¶
Overview ¶
Package drivers talks to various database backends and retrieves table, column, type, and foreign key information
Index ¶
- Constants
- func ColumnDBTypes(cols []Column) map[string]string
- func ColumnNames(cols []Column) []string
- func ColumnsFromList(list []string, tablename string) []string
- func DefaultEnv(key, def string) string
- func DriverMain(driver Interface)
- func RegisterBinary(name, path string)
- func RegisterFromInit(name string, driver Interface)
- func TablesFromList(list []string) []string
- type Column
- type Config
- func (c Config) DefaultInt(key string, def int) int
- func (c Config) DefaultString(key, def string) string
- func (c Config) Int(key string) (int, bool)
- func (c Config) MustInt(key string) int
- func (c Config) MustString(key string) string
- func (c Config) String(key string) (string, bool)
- func (c Config) StringSlice(key string) ([]string, bool)
- type Constructor
- type DBInfo
- type Dialect
- type ForeignKey
- type Interface
- type PrimaryKey
- type SQLColumnDef
- type SQLColumnDefs
- type Table
- type ToManyRelationship
- type ToOneRelationship
Constants ¶
const ( ConfigBlacklist = "blacklist" ConfigWhitelist = "whitelist" ConfigSchema = "schema" ConfigUser = "user" ConfigPass = "pass" ConfigHost = "host" ConfigPort = "port" ConfigDBName = "dbname" ConfigSSLMode = "sslmode" )
These constants are used in the config map passed into the driver
Variables ¶
This section is empty.
Functions ¶
func ColumnDBTypes ¶
ColumnDBTypes of the columns.
func ColumnsFromList ¶
ColumnsFromList takes a whitelist or blacklist and returns the columns for a given table.
func DefaultEnv ¶
DefaultEnv grabs a value from the environment or a default. This is shared by drivers to get config for testing.
func DriverMain ¶
func DriverMain(driver Interface)
DriverMain helps dry up the implementation of main.go for drivers
func RegisterBinary ¶
func RegisterBinary(name, path string)
RegisterBinary is used to register drivers that are binaries. Panics if a driver with the same name has been previously loaded.
func RegisterFromInit ¶
RegisterFromInit is typically called by a side-effect loaded driver during init time. Panics if a driver with the same name has been previously loaded.
func TablesFromList ¶
TablesFromList takes a whitelist or blacklist and returns the table names.
Types ¶
type Column ¶
type Column struct {
Name string `json:"name" toml:"name"`
Type string `json:"type" toml:"type"`
DBType string `json:"db_type" toml:"db_type"`
Default string `json:"default" toml:"default"`
Comment string `json:"comment" toml:"comment"`
Nullable bool `json:"nullable" toml:"nullable"`
Unique bool `json:"unique" toml:"unique"`
Validated bool `json:"validated" toml:"validated"`
// Postgres only extension bits
// ArrType is the underlying data type of the Postgres
// ARRAY type. See here:
// https://www.postgresql.org/docs/9.1/static/infoschema-element-types.html
ArrType *string `json:"arr_type" toml:"arr_type"`
UDTName string `json:"udt_name" toml:"udt_name"`
// DomainName is the domain type name associated to the column. See here:
// https://www.postgresql.org/docs/10/extend-type-system.html#EXTEND-TYPE-SYSTEM-DOMAINS
DomainName *string `json:"domain_name" toml:"domain_name"`
// MySQL only bits
// Used to get full type, ex:
// tinyint(1) instead of tinyint
// Used for "tinyint-as-bool" flag
FullDBType string `json:"full_db_type" toml:"full_db_type"`
// MS SQL only bits
// Used to indicate that the value
// for this column is auto generated by database on insert (i.e. - timestamp (old) or rowversion (new))
AutoGenerated bool `json:"auto_generated" toml:"auto_generated"`
}
Column holds information about a database column. Types are Go types, converted by TranslateColumnType.
func FilterColumnsByAuto ¶
FilterColumnsByAuto generates the list of columns that have autogenerated values
func FilterColumnsByDefault ¶
FilterColumnsByDefault generates the list of columns that have default values
func FilterColumnsByEnum ¶
FilterColumnsByEnum generates the list of columns that are enum values.
type Config ¶
type Config map[string]interface{}
Config is a map with helper functions
func (Config) DefaultInt ¶
DefaultInt retrieves a non-zero int or the default value provided.
func (Config) DefaultString ¶
DefaultString retrieves a non-empty string or the default value provided.
func (Config) Int ¶
Int retrieves an int, the bool says if it exists, is of the appropriate type, and is non-zero. Coerces float64 to int because JSON and Javascript kinda suck.
func (Config) MustInt ¶
MustInt retrieves a string that must exist and must be an int, and it must not be 0
func (Config) MustString ¶
MustString retrieves a string that must exist and must be a string, it must also not be the empty string
type Constructor ¶
type Constructor interface {
TableNames(schema string, whitelist, blacklist []string) ([]string, error)
Columns(schema, tableName string, whitelist, blacklist []string) ([]Column, error)
PrimaryKeyInfo(schema, tableName string) (*PrimaryKey, error)
ForeignKeyInfo(schema, tableName string) ([]ForeignKey, error)
// TranslateColumnType takes a Database column type and returns a go column type.
TranslateColumnType(Column) Column
}
Constructor breaks down the functionality required to implement a driver such that the drivers.Tables method can be used to reduce duplication in driver implementations.
type DBInfo ¶
type DBInfo struct {
Schema string `json:"schema"`
Tables []Table `json:"tables"`
Dialect Dialect `json:"dialect"`
}
DBInfo is the database's table data and dialect.
type Dialect ¶
type Dialect struct {
LQ rune `json:"lq"`
RQ rune `json:"rq"`
UseIndexPlaceholders bool `json:"use_index_placeholders"`
UseLastInsertID bool `json:"use_last_insert_id"`
UseSchema bool `json:"use_schema"`
UseDefaultKeyword bool `json:"use_default_keyword"`
// The following is mostly for T-SQL/MSSQL, what a show
UseAutoColumns bool `json:"use_auto_columns"`
UseTopClause bool `json:"use_top_clause"`
UseOutputClause bool `json:"use_output_clause"`
UseCaseWhenExistsClause bool `json:"use_case_when_exists_clause"`
}
Dialect describes the databases requirements in terms of which features it speaks and what kind of quoting mechanisms it uses.
WARNING: When updating this struct there is a copy of it inside the boil_queries template that is used for users to create queries without having to figure out what their dialect is.
type ForeignKey ¶
type ForeignKey struct {
Table string `json:"table"`
Name string `json:"name"`
Column string `json:"column"`
Nullable bool `json:"nullable"`
Unique bool `json:"unique"`
ForeignTable string `json:"foreign_table"`
ForeignColumn string `json:"foreign_column"`
ForeignColumnNullable bool `json:"foreign_column_nullable"`
ForeignColumnUnique bool `json:"foreign_column_unique"`
}
ForeignKey represents a foreign key constraint in a database
type Interface ¶
type Interface interface {
// Assemble the database information into a nice struct
Assemble(config Config) (*DBInfo, error)
// Templates to add/replace for generation
Templates() (map[string]string, error)
// Imports to merge for generation
Imports() (importers.Collection, error)
}
Interface abstracts either a side-effect imported driver or a binary that is called in order to produce the data required for generation.
type PrimaryKey ¶
PrimaryKey represents a primary key constraint in a database
type SQLColumnDef ¶
SQLColumnDef formats a column name and type like an SQL column definition.
type SQLColumnDefs ¶
type SQLColumnDefs []SQLColumnDef
SQLColumnDefs has small helper functions
func SQLColDefinitions ¶
func SQLColDefinitions(cols []Column, names []string) SQLColumnDefs
SQLColDefinitions creates a definition in sql format for a column
type Table ¶
type Table struct {
Name string `json:"name"`
// For dbs with real schemas, like Postgres.
// Example value: "schema_name"."table_name"
SchemaName string `json:"schema_name"`
Columns []Column `json:"columns"`
PKey *PrimaryKey `json:"p_key"`
FKeys []ForeignKey `json:"f_keys"`
IsJoinTable bool `json:"is_join_table"`
ToOneRelationships []ToOneRelationship `json:"to_one_relationships"`
ToManyRelationships []ToManyRelationship `json:"to_many_relationships"`
}
Table metadata from the database schema.
func Tables ¶
func Tables(c Constructor, schema string, whitelist, blacklist []string) ([]Table, error)
Tables returns the metadata for all tables, minus the tables specified in the blacklist.
func (Table) CanLastInsertID ¶
CanLastInsertID checks the following: 1. Is there only one primary key? 2. Does the primary key column have a default value? 3. Is the primary key column type one of uintX/intX? If the above is all true, this table can use LastInsertId
func (Table) CanSoftDelete ¶
type ToManyRelationship ¶
type ToManyRelationship struct {
Name string `json:"name"`
Table string `json:"table"`
Column string `json:"column"`
Nullable bool `json:"nullable"`
Unique bool `json:"unique"`
ForeignTable string `json:"foreign_table"`
ForeignColumn string `json:"foreign_column"`
ForeignColumnNullable bool `json:"foreign_column_nullable"`
ForeignColumnUnique bool `json:"foreign_column_unique"`
ToJoinTable bool `json:"to_join_table"`
JoinTable string `json:"join_table"`
JoinLocalFKeyName string `json:"join_local_fkey_name"`
JoinLocalColumn string `json:"join_local_column"`
JoinLocalColumnNullable bool `json:"join_local_column_nullable"`
JoinLocalColumnUnique bool `json:"join_local_column_unique"`
JoinForeignFKeyName string `json:"join_foreign_fkey_name"`
JoinForeignColumn string `json:"join_foreign_column"`
JoinForeignColumnNullable bool `json:"join_foreign_column_nullable"`
JoinForeignColumnUnique bool `json:"join_foreign_column_unique"`
}
ToManyRelationship describes a relationship between two tables where the local table has no id, and the foreign table has an id that matches a column in the local table.
func ToManyRelationships ¶
func ToManyRelationships(table string, tables []Table) []ToManyRelationship
ToManyRelationships relationship lookups Input should be the sql name of a table like: videos
type ToOneRelationship ¶
type ToOneRelationship struct {
Name string `json:"name"`
Table string `json:"table"`
Column string `json:"column"`
Nullable bool `json:"nullable"`
Unique bool `json:"unique"`
ForeignTable string `json:"foreign_table"`
ForeignColumn string `json:"foreign_column"`
ForeignColumnNullable bool `json:"foreign_column_nullable"`
ForeignColumnUnique bool `json:"foreign_column_unique"`
}
ToOneRelationship describes a relationship between two tables where the local table has no id, and the foreign table has an id that matches a column in the local table, that column can also be unique which changes the dynamic into a one-to-one style, not a to-many.
func ToOneRelationships ¶
func ToOneRelationships(table string, tables []Table) []ToOneRelationship
ToOneRelationships relationship lookups Input should be the sql name of a table like: videos