-
Notifications
You must be signed in to change notification settings - Fork 0
/
default_driver_sql_builder_table_create.go
116 lines (111 loc) · 2.59 KB
/
default_driver_sql_builder_table_create.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package defaultDriver
import (
"bytes"
"fmt"
"github.com/go-xe2/x/type/t"
. "github.com/go-xe2/x/xf/ef/xdriveri"
)
func (dr *TDbDefaultDriver) buildDbTypeString(ddType DbDataType, size int, decimal int) string {
switch ddType {
case DbDataInt:
return "int"
case DbDataTinyint:
if size > 0 {
return fmt.Sprintf("tinyint(%d)", size)
}
return "tinyint"
case DbDataSmallint:
return "smallint"
case DbDataBigint:
return "bigint"
case DbDataFloat:
return "float"
case DbDataDouble:
return "double"
case DbDataDecimal:
s := "decimal(18,2)"
if size > 0 && decimal == 0 {
s = fmt.Sprintf("decimal(%d,2)", size)
} else if size == 0 && decimal > 0 {
s = fmt.Sprintf("decimal(%d,%d)", size+decimal, decimal)
}
return s
case DbDataDate:
return "date"
case DbDataTime:
return "time"
case DbDataDateTime:
return "datetime"
case DbDataChar:
if size == 0 {
return "char(30)"
}
return fmt.Sprintf("char(%d)", size)
case DbDataVarchar:
if size == 0 {
return "varchar(60)"
}
return fmt.Sprintf("varchar(%d)", size)
case DbDataTinytext:
return "tinytext"
case DbDataText:
return "text"
case DbDataLongText:
return "longtext"
case DbDataBlob:
return "blob"
case DbDataTinyblob:
return "tinyblob"
case DbDataLongblob:
return "longblob"
case DbDataBinary:
if size > 0 {
return fmt.Sprintf("binary(%d)", size)
}
return fmt.Sprintf("binary(30)")
case DbDataVarbinary:
if size > 0 {
return fmt.Sprintf("varbinary(%d)", size)
}
return fmt.Sprint("varbinary(30)")
default:
return "varchar(60)"
}
}
func (dr *TDbDefaultDriver) buildTableFieldCreate(fields []DBFieldDefine) string {
buf := bytes.NewBufferString("")
for _, field := range fields {
buf.WriteString(",\n")
buf.WriteString(field.FieldName())
buf.WriteString(dr.buildDbTypeString(field.Type(), field.Size(), field.Decimal()))
if field.AutoIncrement() {
buf.WriteString(" auto_increment")
}
defaultV := field.Default()
if defaultV != nil {
if defaultV == "" {
defaultV = "''"
}
buf.WriteString(" default ")
buf.WriteString(t.String(field.Default()))
}
if field.AllowNull() {
buf.WriteString(" null")
} else {
buf.WriteString(" not null")
}
if field.IsPrimary() {
buf.WriteString(" primary key")
}
}
return buf.String()[1:]
}
// 生成创建数据库表脚本
func (dr *TDbDefaultDriver) BuildTableCreate(tableDefine DbTableDefine) string {
if tableDefine == nil {
return ""
}
fields := dr.buildTableFieldCreate(tableDefine.Fields())
s := fmt.Sprintf("create table if not exists %s(\n%s\n);", tableDefine.TableName(), fields)
return s
}