2024-01-29 04:20:23 +00:00
package mssql
import (
"fmt"
"mayfly-go/internal/db/dbm/dbi"
"mayfly-go/pkg/logx"
"strings"
"time"
)
2024-12-08 13:04:23 +08:00
var (
mssqlQuoter = dbi . Quoter {
Prefix : '[' ,
Suffix : ']' ,
IsReserved : dbi . AlwaysReserve ,
}
)
2024-01-29 04:20:23 +00:00
type MssqlDialect struct {
2024-03-18 12:25:40 +08:00
dbi . DefaultDialect
2024-01-29 04:20:23 +00:00
dc * dbi . DbConn
}
func ( md * MssqlDialect ) CopyTable ( copy * dbi . DbCopyTable ) error {
2024-11-01 17:27:22 +08:00
msMetadata := md . dc . GetMetadata ( )
2024-03-11 20:04:20 +08:00
schema := md . dc . Info . CurrentSchema ( )
2024-01-29 04:20:23 +00:00
// 生成新表名,为老表明+_copy_时间戳
newTableName := copy . TableName + "_copy_" + time . Now ( ) . Format ( "20060102150405" )
// 复制建表语句
2024-11-01 17:27:22 +08:00
ddl , err := md . CopyTableDDL ( copy . TableName , newTableName )
2024-01-29 04:20:23 +00:00
if err != nil {
return err
}
// 执行建表
_ , err = md . dc . Exec ( ddl )
if err != nil {
return err
}
// 复制数据
if copy . CopyData {
go func ( ) {
// 查询所有的列
2024-03-11 20:04:20 +08:00
columns , err := msMetadata . GetColumns ( copy . TableName )
2024-01-29 04:20:23 +00:00
if err != nil {
logx . Warnf ( "复制表[%s]数据失败: %s" , copy . TableName , err . Error ( ) )
return
}
// 取出每列名, 需要显示指定列名插入数据
columnNames := make ( [ ] string , 0 )
hasIdentity := false
for _ , v := range columns {
columnNames = append ( columnNames , fmt . Sprintf ( "[%s]" , v . ColumnName ) )
if v . IsIdentity {
hasIdentity = true
}
}
columnsSql := strings . Join ( columnNames , "," )
// 复制数据
// 设置允许填充自增列之后,显示指定列名可以插入自增列
identityInsertOn := ""
if hasIdentity {
identityInsertOn = fmt . Sprintf ( "SET IDENTITY_INSERT [%s].[%s] ON" , schema , newTableName )
}
2024-03-01 04:03:03 +00:00
_ , err = md . dc . Exec ( fmt . Sprintf ( " %s INSERT INTO [%s].[%s] (%s) SELECT * FROM [%s].[%s]" , identityInsertOn , schema , newTableName , columnsSql , schema , copy . TableName ) )
2024-01-29 04:20:23 +00:00
if err != nil {
logx . Warnf ( "复制表[%s]数据失败: %s" , copy . TableName , err . Error ( ) )
}
} ( )
}
return err
}
2024-03-15 09:01:51 +00:00
2024-11-01 17:27:22 +08:00
func ( md * MssqlDialect ) CopyTableDDL ( tableName string , newTableName string ) ( string , error ) {
if newTableName == "" {
newTableName = tableName
}
metadata := md . dc . GetMetadata ( )
// 查询表名和表注释, 设置表注释
tbs , err := metadata . GetTables ( tableName )
if err != nil || len ( tbs ) < 1 {
2024-12-08 13:04:23 +08:00
logx . Errorf ( "failed to get table, %s" , tableName )
2024-11-01 17:27:22 +08:00
return "" , err
}
tabInfo := & dbi . Table {
TableName : newTableName ,
TableComment : tbs [ 0 ] . TableComment ,
}
// 查询列信息
columns , err := metadata . GetColumns ( tableName )
if err != nil {
2024-12-08 13:04:23 +08:00
logx . Errorf ( "failed to get columns, %s" , tableName )
2024-11-01 17:27:22 +08:00
return "" , err
}
2024-12-08 13:04:23 +08:00
sqlGener := md . GetSQLGenerator ( )
sqlArr := sqlGener . GenTableDDL ( * tabInfo , columns , true )
2024-11-01 17:27:22 +08:00
// 设置索引
indexs , err := metadata . GetTableIndex ( tableName )
if err != nil {
2024-12-08 13:04:23 +08:00
logx . Errorf ( "failed to get indexs, %s" , tableName )
2024-11-01 17:27:22 +08:00
return strings . Join ( sqlArr , ";" ) , err
}
2024-12-08 13:04:23 +08:00
sqlArr = append ( sqlArr , sqlGener . GenIndexDDL ( * tabInfo , indexs ) ... )
2024-11-01 17:27:22 +08:00
return strings . Join ( sqlArr , ";" ) , nil
2024-03-15 09:01:51 +00:00
}
2024-12-26 04:11:28 +00:00
func ( md * MssqlDialect ) Quoter ( ) dbi . Quoter {
2024-12-08 13:04:23 +08:00
return mssqlQuoter
2024-11-01 17:27:22 +08:00
}
func ( md * MssqlDialect ) GetDumpHelper ( ) dbi . DumpHelper {
return new ( DumpHelper )
}
2024-12-08 13:04:23 +08:00
func ( md * MssqlDialect ) GetSQLGenerator ( ) dbi . SQLGenerator {
return & SQLGenerator { dc : md . dc }
2024-03-15 09:01:51 +00:00
}