Files
mayfly-go/server/internal/db/dbm/dbi/dialect.go

110 lines
2.8 KiB
Go
Raw Normal View History

package dbi
2022-10-15 17:38:34 +08:00
2023-05-24 12:32:17 +08:00
import (
2024-03-18 12:25:40 +08:00
"errors"
"io"
"mayfly-go/internal/db/dbm/sqlparser"
"mayfly-go/internal/db/dbm/sqlparser/pgsql"
)
const (
// -1. 无操作
DuplicateStrategyNone = -1
// 1. 忽略
DuplicateStrategyIgnore = 1
// 2. 更新
DuplicateStrategyUpdate = 2
)
type DbCopyTable struct {
Id uint64 `json:"id"`
Db string `json:"db" `
TableName string `json:"tableName"`
CopyData bool `json:"copyData"` // 是否复制数据
}
// BaseDialect 基础dialect在DefaultDialect 都有默认的实现方法
type BaseDialect interface {
2024-12-08 13:04:23 +08:00
// Quoter sql关键字引用处理如 table -> `table`、table -> "table"
Quoter() Quoter
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
GetDbProgram() (DbProgram, error)
// GetDumpHeler
GetDumpHelper() DumpHelper
// GetSQLParser 获取sql解析器
GetSQLParser() sqlparser.SqlParser
}
// -----------------------------------元数据接口定义------------------------------------------
// Dialect 数据库方言 用于生成sql、批量插入等各个数据库方言不一致的实现方式
type Dialect interface {
BaseDialect
// CopyTable 拷贝表
CopyTable(copy *DbCopyTable) error
2024-12-08 13:04:23 +08:00
// GetSQLGenerator 获取sql生成器
GetSQLGenerator() SQLGenerator
2024-03-18 12:25:40 +08:00
}
// DefaultDialect 默认实现若需要覆盖则由各个数据库dialect实现去覆盖重写
2024-03-18 12:25:40 +08:00
type DefaultDialect struct {
}
var _ (BaseDialect) = (*DefaultDialect)(nil)
2024-12-08 13:04:23 +08:00
func (dx *DefaultDialect) Quoter() Quoter {
return DefaultQuoter
}
2024-03-18 12:25:40 +08:00
func (dd *DefaultDialect) GetDbProgram() (DbProgram, error) {
return nil, errors.New("not support db program")
}
func (dd *DefaultDialect) GetDumpHelper() DumpHelper {
return new(DefaultDumpHelper)
}
func (pd *DefaultDialect) GetSQLParser() sqlparser.SqlParser {
return new(pgsql.PgsqlParser)
}
// DumpHelper 导出辅助方法
type DumpHelper interface {
BeforeInsert(writer io.Writer, tableName string)
BeforeInsertSql(quoteSchema string, quoteTableName string) string
AfterInsert(writer io.Writer, tableName string, columns []Column)
}
type DefaultDumpHelper struct {
}
func (dd *DefaultDumpHelper) BeforeInsert(writer io.Writer, tableName string) {
writer.Write([]byte("BEGIN;\n"))
}
func (dd *DefaultDumpHelper) BeforeInsertSql(quoteSchema string, quoteTableName string) string {
return ""
}
func (dd *DefaultDumpHelper) AfterInsert(writer io.Writer, tableName string, columns []Column) {
writer.Write([]byte("COMMIT;\n"))
}
2024-12-08 13:04:23 +08:00
type SQLGenerator interface {
// GenTableDDL 生成建表语句
GenTableDDL(table Table, columns []Column, dropBeforeCreate bool) []string
// GenIndexDDL 生成索引语句
GenIndexDDL(table Table, indexs []Index) []string
// GenInsert 生成插入语句
GenInsert(tableName string, columns []Column, values [][]any, duplicateStrategy int) []string
}