0d3b7dcd by astaxie

Merge pull request #911 from supar/add-column-default-attribute

Add attribute default to the column on create or alter commands. Skip co...
2 parents 378356a6 1a1b0c14
...@@ -104,7 +104,11 @@ func getColumnAddQuery(al *alias, fi *fieldInfo) string { ...@@ -104,7 +104,11 @@ func getColumnAddQuery(al *alias, fi *fieldInfo) string {
104 typ += " " + "NOT NULL" 104 typ += " " + "NOT NULL"
105 } 105 }
106 106
107 return fmt.Sprintf("ALTER TABLE %s%s%s ADD COLUMN %s%s%s %s", Q, fi.mi.table, Q, Q, fi.column, Q, typ) 107 return fmt.Sprintf("ALTER TABLE %s%s%s ADD COLUMN %s%s%s %s %s",
108 Q, fi.mi.table, Q,
109 Q, fi.column, Q,
110 typ, getColumnDefault(fi),
111 )
108 } 112 }
109 113
110 // create database creation string. 114 // create database creation string.
...@@ -155,6 +159,9 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex ...@@ -155,6 +159,9 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex
155 //if fi.initial.String() != "" { 159 //if fi.initial.String() != "" {
156 // column += " DEFAULT " + fi.initial.String() 160 // column += " DEFAULT " + fi.initial.String()
157 //} 161 //}
162
163 // Append attribute DEFAULT
164 column += getColumnDefault(fi)
158 165
159 if fi.unique { 166 if fi.unique {
160 column += " " + "UNIQUE" 167 column += " " + "UNIQUE"
...@@ -239,3 +246,44 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex ...@@ -239,3 +246,44 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex
239 246
240 return 247 return
241 } 248 }
249
250
251 // Get string value for the attribute "DEFAULT" for the CREATE, ALTER commands
252 func getColumnDefault(fi *fieldInfo) string {
253 var (
254 v, t, d string
255 )
256
257 // Skip default attribute if field is in relations
258 if fi.rel || fi.reverse {
259 return v
260 }
261
262 t = " DEFAULT '%s' "
263
264 // These defaults will be useful if there no config value orm:"default" and NOT NULL is on
265 switch fi.fieldType {
266 case TypeDateField, TypeDateTimeField:
267 return v;
268
269 case TypeBooleanField, TypeBitField, TypeSmallIntegerField, TypeIntegerField,
270 TypeBigIntegerField, TypePositiveBitField, TypePositiveSmallIntegerField,
271 TypePositiveIntegerField, TypePositiveBigIntegerField, TypeFloatField,
272 TypeDecimalField:
273 d = "0"
274 }
275
276 if fi.colDefault {
277 if !fi.initial.Exist() {
278 v = fmt.Sprintf(t, "")
279 } else {
280 v = fmt.Sprintf(t, fi.initial.String())
281 }
282 } else {
283 if !fi.null {
284 v = fmt.Sprintf(t, d)
285 }
286 }
287
288 return v
289 }
......
...@@ -116,6 +116,7 @@ type fieldInfo struct { ...@@ -116,6 +116,7 @@ type fieldInfo struct {
116 null bool 116 null bool
117 index bool 117 index bool
118 unique bool 118 unique bool
119 colDefault bool
119 initial StrTo 120 initial StrTo
120 size int 121 size int
121 auto_now bool 122 auto_now bool
...@@ -280,6 +281,11 @@ checkType: ...@@ -280,6 +281,11 @@ checkType:
280 fi.pk = attrs["pk"] 281 fi.pk = attrs["pk"]
281 fi.unique = attrs["unique"] 282 fi.unique = attrs["unique"]
282 283
284 // Mark object property if there is attribute "default" in the orm configuration
285 if _, ok := tags["default"]; ok {
286 fi.colDefault = true
287 }
288
283 switch fieldType { 289 switch fieldType {
284 case RelManyToMany, RelReverseMany, RelReverseOne: 290 case RelManyToMany, RelReverseMany, RelReverseOne:
285 fi.null = false 291 fi.null = false
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!