198 lines
4.4 KiB
Go
198 lines
4.4 KiB
Go
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 + "'"
|
|
}
|