support sqlite
支持sqlite
This commit is contained in:
197
data/view/model/gensqlite/gensqlite.go
Normal file
197
data/view/model/gensqlite/gensqlite.go
Normal file
@@ -0,0 +1,197 @@
|
||||
package gensqlite
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/xxjwxc/public/mylog"
|
||||
|
||||
"github.com/jinzhu/gorm"
|
||||
_ "github.com/mattn/go-sqlite3"
|
||||
"github.com/xxjwxc/gormt/data/config"
|
||||
"github.com/xxjwxc/gormt/data/view/model"
|
||||
"github.com/xxjwxc/public/tools"
|
||||
)
|
||||
|
||||
// SQLiteModel mysql model from IModel
|
||||
var SQLiteModel sqliteModel
|
||||
|
||||
type sqliteModel struct {
|
||||
}
|
||||
|
||||
// GenModel get model.DBInfo info.获取数据库相关属性
|
||||
func (m *sqliteModel) GenModel() model.DBInfo {
|
||||
db, err := gorm.Open("sqlite3", config.GetDbInfo().Host)
|
||||
if err != nil {
|
||||
mylog.Error(err)
|
||||
return model.DBInfo{}
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
var dbInfo model.DBInfo
|
||||
m.getPackageInfo(db, &dbInfo)
|
||||
dbInfo.PackageName = m.GetPkgName()
|
||||
dbInfo.DbName = m.GetDbName()
|
||||
return dbInfo
|
||||
}
|
||||
|
||||
// GetDbName get database name.获取数据库名字
|
||||
func (m *sqliteModel) GetDbName() string {
|
||||
dir := config.GetDbInfo().Host
|
||||
dir = strings.Replace(dir, "\\", "/", -1)
|
||||
if len(dir) > 0 {
|
||||
if dir[len(dir)-1] == '/' {
|
||||
dir = dir[:(len(dir) - 1)]
|
||||
}
|
||||
}
|
||||
var dbName string
|
||||
list := strings.Split(dir, "/")
|
||||
if len(list) > 0 {
|
||||
dbName = list[len(list)-1]
|
||||
}
|
||||
list = strings.Split(dbName, ".")
|
||||
if len(list) > 0 {
|
||||
dbName = list[0]
|
||||
}
|
||||
|
||||
if len(dbName) == 0 || dbName == "." {
|
||||
panic(fmt.Sprintf("%v : db host config err.must file dir", dbName))
|
||||
}
|
||||
|
||||
return dbName
|
||||
}
|
||||
|
||||
// GetPkgName package names through config outdir configuration.通过config outdir 配置获取包名
|
||||
func (m *sqliteModel) GetPkgName() string {
|
||||
dir := config.GetOutDir()
|
||||
dir = strings.Replace(dir, "\\", "/", -1)
|
||||
if len(dir) > 0 {
|
||||
if dir[len(dir)-1] == '/' {
|
||||
dir = dir[:(len(dir) - 1)]
|
||||
}
|
||||
}
|
||||
var pkgName string
|
||||
list := strings.Split(dir, "/")
|
||||
if len(list) > 0 {
|
||||
pkgName = list[len(list)-1]
|
||||
}
|
||||
|
||||
if len(pkgName) == 0 || pkgName == "." {
|
||||
list = strings.Split(tools.GetModelPath(), "/")
|
||||
if len(list) > 0 {
|
||||
pkgName = list[len(list)-1]
|
||||
}
|
||||
}
|
||||
|
||||
return pkgName
|
||||
}
|
||||
|
||||
func (m *sqliteModel) getPackageInfo(orm *gorm.DB, info *model.DBInfo) {
|
||||
tabls := m.getTables(orm) // get table and notes
|
||||
for tabName, notes := range tabls {
|
||||
var tab model.TabInfo
|
||||
tab.Name = tabName
|
||||
tab.Notes = notes
|
||||
|
||||
if config.GetIsOutSQL() {
|
||||
// Get create SQL statements.获取创建sql语句
|
||||
rows, err := orm.Raw("SELECT tbl_name,sql FROM sqlite_master WHERE type='table' AND name = " + assemblyTable(tabName)).Rows()
|
||||
//defer rows.Close()
|
||||
if err == nil {
|
||||
if rows.Next() {
|
||||
var table, CreateTable string
|
||||
rows.Scan(&table, &CreateTable)
|
||||
tab.SQLBuildStr = CreateTable
|
||||
}
|
||||
}
|
||||
rows.Close()
|
||||
// ----------end
|
||||
}
|
||||
|
||||
// build element.构造元素
|
||||
tab.Em = m.getTableElement(orm, tabName)
|
||||
// --------end
|
||||
|
||||
info.TabList = append(info.TabList, tab)
|
||||
}
|
||||
// sort tables
|
||||
sort.Slice(info.TabList, func(i, j int) bool {
|
||||
return info.TabList[i].Name < info.TabList[j].Name
|
||||
})
|
||||
}
|
||||
|
||||
// getTableElement Get table columns and comments.获取表列及注释
|
||||
func (m *sqliteModel) getTableElement(orm *gorm.DB, tab string) (el []model.ColumnsInfo) {
|
||||
var list []genColumns
|
||||
// Get table annotations.获取表注释
|
||||
orm.Raw(fmt.Sprintf("PRAGMA table_info(%v)", assemblyTable(tab))).Scan(&list)
|
||||
// filter gorm.Model.过滤 gorm.Model
|
||||
if filterModel(&list) {
|
||||
el = append(el, model.ColumnsInfo{
|
||||
Type: "gorm.Model",
|
||||
})
|
||||
}
|
||||
// -----------------end
|
||||
|
||||
// ForeignKey
|
||||
var foreignKeyList []genForeignKey
|
||||
if config.GetIsForeignKey() {
|
||||
}
|
||||
// ------------------end
|
||||
|
||||
for _, v := range list {
|
||||
var tmp model.ColumnsInfo
|
||||
tmp.Name = v.Name
|
||||
tmp.Type = v.Type
|
||||
FixElementNote(&tmp, "")
|
||||
if v.Pk == 1 { // 主键
|
||||
tmp.Index = append(tmp.Index, model.KList{
|
||||
Key: model.ColumnsKeyPrimary,
|
||||
Multi: false,
|
||||
})
|
||||
}
|
||||
|
||||
tmp.IsNull = (v.NotNull != 1)
|
||||
|
||||
// ForeignKey
|
||||
fixForeignKey(foreignKeyList, tmp.Name, &tmp.ForeignKeyList)
|
||||
// -----------------end
|
||||
el = append(el, tmp)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// getTables Get columns and comments.获取表列及注释
|
||||
func (m *sqliteModel) getTables(orm *gorm.DB) map[string]string {
|
||||
tbDesc := make(map[string]string)
|
||||
|
||||
// Get column names.获取列名
|
||||
var tables []string
|
||||
|
||||
rows, err := orm.Raw("SELECT name FROM sqlite_master WHERE type='table'").Rows()
|
||||
if err != nil {
|
||||
if !config.GetIsGUI() {
|
||||
fmt.Println(err)
|
||||
}
|
||||
return tbDesc
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
var table string
|
||||
rows.Scan(&table)
|
||||
if !strings.EqualFold(table, "sqlite_sequence") { // 剔除系统默认
|
||||
tables = append(tables, table)
|
||||
tbDesc[table] = ""
|
||||
}
|
||||
}
|
||||
rows.Close()
|
||||
|
||||
// TODO.获取表注释
|
||||
|
||||
return tbDesc
|
||||
}
|
||||
|
||||
func assemblyTable(name string) string {
|
||||
return "'" + name + "'"
|
||||
}
|
||||
Reference in New Issue
Block a user