Add relationship "to_one" template.

- Temporarily add some new helper functions, going to clean these all
  up in favor of pipes
- Annotate a couple of super weird methods
- Fix a printf verb for err
This commit is contained in:
Aaron L 2016-06-19 16:00:37 -07:00
parent 2819c1c889
commit f46c2c5337
5 changed files with 56 additions and 5 deletions

View file

@ -295,7 +295,8 @@ func WherePrimaryKey(pkeyCols []string, start int) string {
return output
}
// AutoIncPrimKey returns the auto-increment primary key column name or an empty string
// AutoIncPrimaryKey returns the auto-increment primary key column name or an
// empty string.
func AutoIncPrimaryKey(cols []dbdrivers.Column, pkey *dbdrivers.PrimaryKey) string {
if pkey == nil {
return ""
@ -315,7 +316,7 @@ func AutoIncPrimaryKey(cols []dbdrivers.Column, pkey *dbdrivers.PrimaryKey) stri
return ""
}
// ColumnsToString changes the columns into a list of column names
// ColumnsToStrings changes the columns into a list of column names
func ColumnsToStrings(cols []dbdrivers.Column) []string {
names := make([]string, len(cols))
for i, c := range cols {
@ -353,8 +354,8 @@ func PrimaryKeyFlagIndex(regularCols []dbdrivers.Column, pkeyCols []string) int
return len(regularCols) - len(pkeyCols) + 1
}
// SupportsResult returns whether the database driver supports the sql.Results
// interface, i.e. LastReturnId and RowsAffected
// SupportsResultObject returns whether the database driver supports the
// sql.Results interface, i.e. LastReturnId and RowsAffected
func SupportsResultObject(driverName string) bool {
switch driverName {
case "postgres":
@ -389,3 +390,19 @@ func FilterColumnsByAutoIncrement(columns []dbdrivers.Column) string {
return strings.Join(cols, `,`)
}
// AddID to the end of the string
func AddID(str string) string {
return str + "_id"
}
// RemoveID from the end of the string
func RemoveID(str string) string {
return strings.TrimSuffix(str, "_id")
}
// Substring returns a substring of str starting at index start and going
// to end-1.
func Substring(start, end int, str string) string {
return str[start:end]
}

View file

@ -7,10 +7,14 @@ import (
"github.com/nullbio/sqlboiler/dbdrivers"
)
// RandDBStruct does nothing yet
// TODO(nullbio): What is this?
func RandDBStruct(varName string, table dbdrivers.Table) string {
return ""
}
// RandDBStructSlice randomizes a struct?
// TODO(nullbio): What is this?
func RandDBStructSlice(varName string, num int, table dbdrivers.Table) string {
var structs []string
for i := 0; i < num; i++ {

View file

@ -84,6 +84,9 @@ func loadTemplate(dir string, filename string) (*template.Template, error) {
// templates. If you wish to pass a new function into your own template,
// add a function pointer here.
var templateFunctions = template.FuncMap{
"tolower": strings.ToLower,
"toupper": strings.ToUpper,
"substring": strmangle.Substring,
"singular": strmangle.Singular,
"plural": strmangle.Plural,
"titleCase": strmangle.TitleCase,
@ -113,6 +116,8 @@ var templateFunctions = template.FuncMap{
"filterColumnsByDefault": strmangle.FilterColumnsByDefault,
"filterColumnsByAutoIncrement": strmangle.FilterColumnsByAutoIncrement,
"autoIncPrimaryKey": strmangle.AutoIncPrimaryKey,
"addID": strmangle.AddID,
"removeID": strmangle.RemoveID,
"randDBStruct": strmangle.RandDBStruct,
"randDBStructSlice": strmangle.RandDBStructSlice,

View file

@ -21,7 +21,7 @@ func {{$tableNameSingular}}FindX(exec boil.Executor, {{primaryKeyFuncSig .Table.
err := boil.ExecQueryOne(q).Scan(boil.GetStructPointers({{$varNameSingular}}, selectCols...)...)
if err != nil {
return nil, fmt.Errorf("{{.PkgName}}: unable to select from {{.Table.Name}}: %s", err)
return nil, fmt.Errorf("{{.PkgName}}: unable to select from {{.Table.Name}}: %v", err)
}
return {{$varNameSingular}}, nil

View file

@ -0,0 +1,25 @@
{{- if .Table.IsJoinTable -}}
{{- else -}}
{{- $pkg := .PkgName -}}
{{- $localTable := titleCaseSingular .Table.Name -}}
{{- range .Table.FKeys -}}
{{- $localColumn := .Column | removeID | titleCaseSingular -}}
{{- $foreignColumn := .Column | removeID | titleCaseSingular -}}
{{- $foreignTable := titleCaseSingular .ForeignTable -}}
{{- $varname := camelCaseSingular .ForeignTable -}}
{{- $receiver := $localTable | tolower | substring 0 1 -}}
// {{$foreignColumn}} fetches the {{$foreignTable}} pointed to by the foreign key.
func ({{$receiver}} *{{$localTable}}) {{$foreignColumn}}(exec boil.Executor, selectCols ...string) (*{{$foreignTable}}, error) {
{{$varname}} := &{{$foreignTable}}{}
query := fmt.Sprintf(`select %s from {{.ForeignTable}} where id = $1`, strings.Join(selectCols, `,`))
err := exec.QueryRow(query, {{$receiver}}.{{titleCase .Column}}).Scan(boil.GetStructPointers({{$varname}}, selectCols...)...)
if err != nil {
return nil, fmt.Errorf(`{{$pkg}}: unable to select from {{.ForeignTable}}: %v`, err)
}
return {{$varname}}, nil
}
{{end -}}
{{- end -}}