Merge pull request #911 from supar/add-column-default-attribute
Add attribute default to the column on create or alter commands. Skip co...
Showing
2 changed files
with
55 additions
and
1 deletions
| ... | @@ -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. |
| ... | @@ -156,6 +160,9 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex | ... | @@ -156,6 +160,9 @@ func getDbCreateSql(al *alias) (sqls []string, tableIndexes map[string][]dbIndex |
| 156 | // column += " DEFAULT " + fi.initial.String() | 160 | // column += " DEFAULT " + fi.initial.String() |
| 157 | //} | 161 | //} |
| 158 | 162 | ||
| 163 | // Append attribute DEFAULT | ||
| 164 | column += getColumnDefault(fi) | ||
| 165 | |||
| 159 | if fi.unique { | 166 | if fi.unique { |
| 160 | column += " " + "UNIQUE" | 167 | column += " " + "UNIQUE" |
| 161 | } | 168 | } |
| ... | @@ -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 | ... | ... |
-
Please register or sign in to post a comment