143 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package orm
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| func getDbAlias(name string) *alias {
 | |
| 	if al, ok := dataBaseCache.get(name); ok {
 | |
| 		return al
 | |
| 	} else {
 | |
| 		fmt.Println(fmt.Sprintf("unknown DataBase alias name %s", name))
 | |
| 		os.Exit(2)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func getDbDropSql(al *alias) (sqls []string) {
 | |
| 	if len(modelCache.cache) == 0 {
 | |
| 		fmt.Println("no Model found, need register your model")
 | |
| 		os.Exit(2)
 | |
| 	}
 | |
| 
 | |
| 	Q := al.DbBaser.TableQuote()
 | |
| 
 | |
| 	for _, mi := range modelCache.allOrdered() {
 | |
| 		sqls = append(sqls, fmt.Sprintf(`DROP TABLE IF EXISTS %s%s%s`, Q, mi.table, Q))
 | |
| 	}
 | |
| 	return sqls
 | |
| }
 | |
| 
 | |
| func getDbCreateSql(al *alias) (sqls []string) {
 | |
| 	if len(modelCache.cache) == 0 {
 | |
| 		fmt.Println("no Model found, need register your model")
 | |
| 		os.Exit(2)
 | |
| 	}
 | |
| 
 | |
| 	Q := al.DbBaser.TableQuote()
 | |
| 	T := al.DbBaser.DbTypes()
 | |
| 
 | |
| 	for _, mi := range modelCache.allOrdered() {
 | |
| 		sql := fmt.Sprintf("-- %s\n", strings.Repeat("-", 50))
 | |
| 		sql += fmt.Sprintf("--  Table Structure for `%s`\n", mi.fullName)
 | |
| 		sql += fmt.Sprintf("-- %s\n", strings.Repeat("-", 50))
 | |
| 
 | |
| 		sql += fmt.Sprintf("CREATE TABLE IF NOT EXISTS %s%s%s (\n", Q, mi.table, Q)
 | |
| 
 | |
| 		columns := make([]string, 0, len(mi.fields.fieldsDB))
 | |
| 
 | |
| 		for _, fi := range mi.fields.fieldsDB {
 | |
| 
 | |
| 			fieldType := fi.fieldType
 | |
| 			column := fmt.Sprintf("    %s%s%s ", Q, fi.column, Q)
 | |
| 			col := ""
 | |
| 
 | |
| 		checkColumn:
 | |
| 			switch fieldType {
 | |
| 			case TypeBooleanField:
 | |
| 				col = T["bool"]
 | |
| 			case TypeCharField:
 | |
| 				col = fmt.Sprintf(T["string"], fi.size)
 | |
| 			case TypeTextField:
 | |
| 				col = T["string-text"]
 | |
| 			case TypeDateField:
 | |
| 				col = T["time.Time-date"]
 | |
| 			case TypeDateTimeField:
 | |
| 				col = T["time.Time"]
 | |
| 			case TypeBitField:
 | |
| 				col = T["int8"]
 | |
| 			case TypeSmallIntegerField:
 | |
| 				col = T["int16"]
 | |
| 			case TypeIntegerField:
 | |
| 				col = T["int32"]
 | |
| 			case TypeBigIntegerField:
 | |
| 				if al.Driver == DR_Sqlite {
 | |
| 					fieldType = TypeIntegerField
 | |
| 					goto checkColumn
 | |
| 				}
 | |
| 				col = T["int64"]
 | |
| 			case TypePositiveBitField:
 | |
| 				col = T["uint8"]
 | |
| 			case TypePositiveSmallIntegerField:
 | |
| 				col = T["uint16"]
 | |
| 			case TypePositiveIntegerField:
 | |
| 				col = T["uint32"]
 | |
| 			case TypePositiveBigIntegerField:
 | |
| 				col = T["uint64"]
 | |
| 			case TypeFloatField:
 | |
| 				col = T["float64"]
 | |
| 			case TypeDecimalField:
 | |
| 				s := T["float64-decimal"]
 | |
| 				if strings.Index(s, "%d") == -1 {
 | |
| 					col = s
 | |
| 				} else {
 | |
| 					col = fmt.Sprintf(s, fi.digits, fi.decimals)
 | |
| 				}
 | |
| 			case RelForeignKey, RelOneToOne:
 | |
| 				fieldType = fi.relModelInfo.fields.pk.fieldType
 | |
| 				goto checkColumn
 | |
| 			}
 | |
| 
 | |
| 			if fi.auto {
 | |
| 				if al.Driver == DR_Postgres {
 | |
| 					column += T["auto"]
 | |
| 				} else {
 | |
| 					column += col + " " + T["auto"]
 | |
| 				}
 | |
| 			} else if fi.pk {
 | |
| 				column += col + " " + T["pk"]
 | |
| 			} else {
 | |
| 				column += col
 | |
| 
 | |
| 				if fi.null == false {
 | |
| 					column += " " + "NOT NULL"
 | |
| 				}
 | |
| 
 | |
| 				if fi.unique {
 | |
| 					column += " " + "UNIQUE"
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			if strings.Index(column, "%COL%") != -1 {
 | |
| 				column = strings.Replace(column, "%COL%", fi.column, -1)
 | |
| 			}
 | |
| 
 | |
| 			columns = append(columns, column)
 | |
| 		}
 | |
| 
 | |
| 		sql += strings.Join(columns, ",\n")
 | |
| 		sql += "\n)"
 | |
| 
 | |
| 		if al.Driver == DR_MySQL {
 | |
| 			sql += " ENGINE=INNODB"
 | |
| 		}
 | |
| 
 | |
| 		sqls = append(sqls, sql)
 | |
| 	}
 | |
| 
 | |
| 	return sqls
 | |
| }
 |