mirror of
https://github.com/ManyakRus/crud_generator.git
synced 2024-12-22 00:36:41 +02:00
190 lines
4.4 KiB
Go
190 lines
4.4 KiB
Go
package dbmeta
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
)
|
|
|
|
// PrimaryKeyCount return the number of primary keys in table
|
|
func PrimaryKeyCount(dbTable DbTableMeta) int {
|
|
primaryKeys := 0
|
|
for _, col := range dbTable.Columns() {
|
|
if col.IsPrimaryKey() {
|
|
primaryKeys++
|
|
}
|
|
}
|
|
return primaryKeys
|
|
}
|
|
|
|
// PrimaryKeyNames return the list of primary key names
|
|
func PrimaryKeyNames(dbTable DbTableMeta) []string {
|
|
primaryKeyNames := make([]string, 0)
|
|
for _, col := range dbTable.Columns() {
|
|
if col.IsPrimaryKey() {
|
|
primaryKeyNames = append(primaryKeyNames, col.Name())
|
|
}
|
|
}
|
|
return primaryKeyNames
|
|
}
|
|
|
|
// NonPrimaryKeyNames return the list of primary key names
|
|
func NonPrimaryKeyNames(dbTable DbTableMeta) []string {
|
|
primaryKeyNames := make([]string, 0)
|
|
for _, col := range dbTable.Columns() {
|
|
if !col.IsPrimaryKey() {
|
|
primaryKeyNames = append(primaryKeyNames, col.Name())
|
|
}
|
|
}
|
|
return primaryKeyNames
|
|
}
|
|
|
|
// GenerateDeleteSQL generate sql for a delete
|
|
func GenerateDeleteSQL(dbTable DbTableMeta) (string, error) {
|
|
primaryCnt := PrimaryKeyCount(dbTable)
|
|
|
|
if primaryCnt == 0 {
|
|
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
buf.WriteString(fmt.Sprintf("DELETE FROM `%s` where", dbTable.TableName()))
|
|
|
|
addedKey := 1
|
|
for _, col := range dbTable.Columns() {
|
|
if col.IsPrimaryKey() {
|
|
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
|
|
addedKey++
|
|
|
|
if addedKey < primaryCnt {
|
|
buf.WriteString(" AND")
|
|
}
|
|
}
|
|
}
|
|
|
|
return buf.String(), nil
|
|
}
|
|
|
|
// GenerateUpdateSQL generate sql for a update
|
|
func GenerateUpdateSQL(dbTable DbTableMeta) (string, error) {
|
|
primaryCnt := PrimaryKeyCount(dbTable)
|
|
// nonPrimaryCnt := len(dbTable.Columns()) - primaryCnt
|
|
|
|
if primaryCnt == 0 {
|
|
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
buf.WriteString(fmt.Sprintf("UPDATE `%s` set", dbTable.TableName()))
|
|
|
|
setCol := 1
|
|
for _, col := range dbTable.Columns() {
|
|
if !col.IsPrimaryKey() {
|
|
if setCol != 1 {
|
|
buf.WriteString(",")
|
|
}
|
|
|
|
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
|
|
setCol++
|
|
}
|
|
}
|
|
|
|
buf.WriteString(" WHERE")
|
|
addedKey := 0
|
|
for _, col := range dbTable.Columns() {
|
|
if col.IsPrimaryKey() {
|
|
buf.WriteString(fmt.Sprintf(" %s = ?", col.Name()))
|
|
|
|
setCol++
|
|
addedKey++
|
|
|
|
if addedKey < primaryCnt {
|
|
buf.WriteString(" AND")
|
|
}
|
|
}
|
|
}
|
|
|
|
return buf.String(), nil
|
|
}
|
|
|
|
// GenerateInsertSQL generate sql for a insert
|
|
func GenerateInsertSQL(dbTable DbTableMeta) (string, error) {
|
|
primaryCnt := PrimaryKeyCount(dbTable)
|
|
|
|
if primaryCnt == 0 {
|
|
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
buf.WriteString(fmt.Sprintf("INSERT INTO `%s` (", dbTable.TableName()))
|
|
|
|
pastFirst := false
|
|
for _, col := range dbTable.Columns() {
|
|
if !col.IsAutoIncrement() {
|
|
if pastFirst {
|
|
buf.WriteString(", ")
|
|
}
|
|
|
|
buf.WriteString(fmt.Sprintf(" %s", col.Name()))
|
|
pastFirst = true
|
|
}
|
|
}
|
|
buf.WriteString(") values ( ")
|
|
|
|
pastFirst = false
|
|
pos := 1
|
|
for _, col := range dbTable.Columns() {
|
|
if !col.IsAutoIncrement() {
|
|
if pastFirst {
|
|
buf.WriteString(", ")
|
|
}
|
|
|
|
buf.WriteString(fmt.Sprintf("?"))
|
|
pos++
|
|
pastFirst = true
|
|
}
|
|
}
|
|
|
|
buf.WriteString(" )")
|
|
return buf.String(), nil
|
|
}
|
|
|
|
// GenerateSelectOneSQL generate sql for selecting one record
|
|
func GenerateSelectOneSQL(dbTable DbTableMeta) (string, error) {
|
|
primaryCnt := PrimaryKeyCount(dbTable)
|
|
|
|
if primaryCnt == 0 {
|
|
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
buf.WriteString(fmt.Sprintf("SELECT * FROM `%s` WHERE ", dbTable.TableName()))
|
|
|
|
pastFirst := false
|
|
pos := 1
|
|
for _, col := range dbTable.Columns() {
|
|
if col.IsPrimaryKey() {
|
|
if pastFirst {
|
|
buf.WriteString(" AND ")
|
|
}
|
|
|
|
buf.WriteString(fmt.Sprintf("%s = ?", col.Name()))
|
|
pos++
|
|
pastFirst = true
|
|
}
|
|
}
|
|
return buf.String(), nil
|
|
}
|
|
|
|
// GenerateSelectMultiSQL generate sql for selecting multiple records
|
|
func GenerateSelectMultiSQL(dbTable DbTableMeta) (string, error) {
|
|
primaryCnt := PrimaryKeyCount(dbTable)
|
|
|
|
if primaryCnt == 0 {
|
|
return "", fmt.Errorf("table %s does not have a primary key, cannot generate sql", dbTable.TableName())
|
|
}
|
|
|
|
buf := bytes.Buffer{}
|
|
buf.WriteString(fmt.Sprintf("SELECT * FROM `%s`", dbTable.TableName()))
|
|
return buf.String(), nil
|
|
}
|