mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-08-28 06:40:24 +08:00
106 lines
3.1 KiB
Go
106 lines
3.1 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/gogf/gf/v2/container/gmap"
|
|
"github.com/gogf/gf/v2/database/gdb"
|
|
)
|
|
|
|
// func getSQLiteSchemaByCli(tableName string, db gdb.DB) (string, error) {
|
|
// dbConf := db.GetConfig()
|
|
// cmd := exec.Command("sqlite3", dbConf.Name, fmt.Sprintf(".schema %s", tableName))
|
|
// glog.Info(context.TODO(), "sqlite3", dbConf.Name, fmt.Sprintf("'.schema %s'", tableName))
|
|
// output, err := cmd.CombinedOutput()
|
|
// if err != nil {
|
|
// return "", err
|
|
// }
|
|
// return strings.TrimSpace(string(output)), nil
|
|
// }
|
|
|
|
func getSQLiteSchemaBySql(ctx context.Context, tableName string, db gdb.DB) (string, error) {
|
|
schemaRes, err := db.GetValue(ctx, fmt.Sprintf(`SELECT sql FROM sqlite_master WHERE type='table' AND name='%s';`, tableName))
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return schemaRes.String(), nil
|
|
}
|
|
|
|
func getSQliteTableComments(createTableSql string) (tableComment, tableName string) {
|
|
// 按照换行符分割文本
|
|
lines := strings.Split(createTableSql, "\n")
|
|
|
|
// 循环输出每一行
|
|
for _, line := range lines {
|
|
// 检查 createTableSql 是否包含 comment
|
|
if strings.Contains(line, "--") {
|
|
if strings.Contains(line, "CREATE TABLE") {
|
|
tableName = getLastWord(strings.Split(line, "(")[0])
|
|
tableComment = strings.Split(line, "--")[1]
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func getSQliteFieldsComments(createTableSql string) (fieldCommentMap gmap.Map, tableComment, tableName string) {
|
|
// 按照换行符分割文本
|
|
lines := strings.Split(createTableSql, "\n")
|
|
|
|
// 循环输出每一行
|
|
for _, line := range lines {
|
|
// 检查 createTableSql 是否包含 comment
|
|
if strings.Contains(line, "--") {
|
|
if strings.Contains(line, "CREATE TABLE") {
|
|
tableName = getLastWord(strings.Split(line, "(")[0])
|
|
tableComment = strings.Split(line, "--")[1]
|
|
} else {
|
|
firstWord := getFirstWord(line)
|
|
lastWord := getLastWord(line)
|
|
fieldCommentMap.Set(firstWord, lastWord)
|
|
}
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func transSqliteTablesComment(ctx context.Context, tableNames []string, db gdb.DB) (tables []*TableComment, err error) {
|
|
schemaStr := ""
|
|
eleIgnore := "sqlite_sequence"
|
|
for _, v := range tableNames {
|
|
if v != eleIgnore {
|
|
schemaStr, err = getSQLiteSchemaBySql(ctx, v, db)
|
|
if err != nil {
|
|
return
|
|
}
|
|
comment, _ := getSQliteTableComments(schemaStr)
|
|
tables = append(tables, &TableComment{
|
|
Name: v,
|
|
Comment: comment,
|
|
})
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func fixSqliteFieldsComment(ctx context.Context, tableName string, db gdb.DB, fields map[string]*gdb.TableField) (map[string]*gdb.TableField, error) {
|
|
// 记录: db.DoSelect 无法执行 .开头的命令
|
|
// schemaRes, err := db.DoSelect(ctx, dbConf.Link, fmt.Sprintf(`.schema %s`, d.QuoteWord(table)))
|
|
// 记录: 查询 sqlite_master 不响应任何结果
|
|
// s, err := db.Query(ctx, `select * from sqlite_master WHERE name="%s";`, tableName)
|
|
// schemaStr, err := getSQLiteSchemaBySql(tableName, db)
|
|
schemaStr, err := getSQLiteSchemaBySql(ctx, tableName, db)
|
|
if err != nil {
|
|
return fields, err
|
|
}
|
|
comments, _, _ := getSQliteFieldsComments(schemaStr)
|
|
for i := range fields {
|
|
if comments.Contains(i) {
|
|
fields[i].Comment = comments.Get(i).(string)
|
|
}
|
|
}
|
|
return fields, nil
|
|
}
|