kra/internal/biz/system/auto_code_sqlite.go

89 lines
2.2 KiB
Go

package system
import (
"context"
"fmt"
"path/filepath"
"strings"
"gorm.io/gorm"
)
// AutoCodeSqlite SQLite适配器
type AutoCodeSqlite struct {
db *gorm.DB
dbList map[string]*gorm.DB
}
// NewAutoCodeSqlite 创建SQLite适配器
func NewAutoCodeSqlite(db *gorm.DB, dbList map[string]*gorm.DB) *AutoCodeSqlite {
return &AutoCodeSqlite{
db: db,
dbList: dbList,
}
}
// GetDB 获取数据库的所有数据库名
func (s *AutoCodeSqlite) GetDB(ctx context.Context) ([]Db, error) {
var entities []Db
sql := "PRAGMA database_list;"
var databaseList []struct {
File string `gorm:"column:file"`
}
err := s.db.WithContext(ctx).Raw(sql).Find(&databaseList).Error
if err != nil {
return nil, err
}
for _, database := range databaseList {
if database.File != "" {
fileName := filepath.Base(database.File)
fileExt := filepath.Ext(fileName)
fileNameWithoutExt := strings.TrimSuffix(fileName, fileExt)
entities = append(entities, Db{Database: fileNameWithoutExt})
}
}
return entities, nil
}
// GetTables 获取数据库的所有表名
func (s *AutoCodeSqlite) GetTables(ctx context.Context, dbName string) ([]Table, error) {
var entities []Table
sql := `SELECT name FROM sqlite_master WHERE type='table'`
var tableNames []string
err := s.db.WithContext(ctx).Raw(sql).Find(&tableNames).Error
if err != nil {
return nil, err
}
for _, tableName := range tableNames {
entities = append(entities, Table{TableName: tableName})
}
return entities, nil
}
// GetColumn 获取指定数据表的所有字段名,类型值等
func (s *AutoCodeSqlite) GetColumn(ctx context.Context, tableName, dbName string) ([]Column, error) {
var entities []Column
sql := fmt.Sprintf("PRAGMA table_info(%s);", tableName)
var columnInfos []struct {
Name string `gorm:"column:name"`
Type string `gorm:"column:type"`
Pk int `gorm:"column:pk"`
}
err := s.db.WithContext(ctx).Raw(sql).Scan(&columnInfos).Error
if err != nil {
return nil, err
}
for _, columnInfo := range columnInfos {
pk := 0
if columnInfo.Pk == 1 {
pk = 1
}
entities = append(entities, Column{
ColumnName: columnInfo.Name,
DataType: columnInfo.Type,
PrimaryKey: pk,
})
}
return entities, nil
}