mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 07:20:24 +08:00
@@ -31,7 +31,7 @@
|
||||
<template #default="scope">
|
||||
<el-input v-if="item.prop === 'name'" size="small" v-model="scope.row.name" />
|
||||
|
||||
<el-select v-else-if="item.prop === 'type'" filterable size="small" v-model="scope.row.type">
|
||||
<el-select v-else-if="item.prop === 'type'" filterable size="small" v-model="scope.row.type" allow-create>
|
||||
<el-option
|
||||
v-for="pgsqlType in getDbDialect(dbType!).getInfo().columnTypes"
|
||||
:key="pgsqlType.dataType"
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
/* eslint-disable no-unused-vars */
|
||||
import { dbApi } from './api';
|
||||
import { getTextWidth } from '@/common/utils/string';
|
||||
import {dbApi} from './api';
|
||||
import {getTextWidth} from '@/common/utils/string';
|
||||
import SqlExecBox from './component/sqleditor/SqlExecBox';
|
||||
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
|
||||
import { editor, languages, Position } from 'monaco-editor';
|
||||
import {editor, languages, Position} from 'monaco-editor';
|
||||
|
||||
import { registerCompletionItemProvider } from '@/components/monaco/completionItemProvider';
|
||||
import { DbDialect, EditorCompletionItem, getDbDialect } from './dialect';
|
||||
import { type RemovableRef, useLocalStorage } from '@vueuse/core';
|
||||
import { DbGetDbNamesMode } from './enums';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import {registerCompletionItemProvider} from '@/components/monaco/completionItemProvider';
|
||||
import {DbDialect, EditorCompletionItem, getDbDialect} from './dialect';
|
||||
import {type RemovableRef, useLocalStorage} from '@vueuse/core';
|
||||
import {DbGetDbNamesMode} from './enums';
|
||||
import {ElMessage} from 'element-plus';
|
||||
|
||||
const hintsStorage: RemovableRef<Map<string, any>> = useLocalStorage('db-table-hints', new Map());
|
||||
const tableStorage: RemovableRef<Map<string, any>> = useLocalStorage('db-tables', new Map());
|
||||
@@ -101,12 +101,13 @@ export class DbInst {
|
||||
// 重置列信息缓存与表提示信息
|
||||
db.columnsMap?.clear();
|
||||
console.log(`load tables -> dbName: ${dbName}`);
|
||||
tables = await dbApi.tableInfos.request({ id: this.id, db: dbName });
|
||||
tables = await dbApi.tableInfos.request({id: this.id, db: dbName});
|
||||
tableStorage.value.set(key, tables);
|
||||
db.tables = tables;
|
||||
|
||||
// 异步加载表提示信息
|
||||
this.loadDbHints(dbName, true).then(() => {});
|
||||
this.loadDbHints(dbName, true).then(() => {
|
||||
});
|
||||
return tables;
|
||||
}
|
||||
|
||||
@@ -115,7 +116,7 @@ export class DbInst {
|
||||
// 表名联想
|
||||
let suggestions: languages.CompletionItem[] = [];
|
||||
tables?.forEach((tableMeta: any, index: any) => {
|
||||
const { tableName, tableComment } = tableMeta;
|
||||
const {tableName, tableComment} = tableMeta;
|
||||
suggestions.push({
|
||||
label: {
|
||||
label: tableName + ' - ' + tableComment,
|
||||
@@ -128,7 +129,7 @@ export class DbInst {
|
||||
sortText: 300 + index + '',
|
||||
});
|
||||
});
|
||||
return { suggestions };
|
||||
return {suggestions};
|
||||
}
|
||||
|
||||
/** 加载列信息提示 */
|
||||
@@ -153,7 +154,7 @@ export class DbInst {
|
||||
});
|
||||
});
|
||||
|
||||
return { suggestions };
|
||||
return {suggestions};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -211,7 +212,7 @@ export class DbInst {
|
||||
return hints;
|
||||
}
|
||||
console.log(`load db-hits -> dbName: ${dbName}`);
|
||||
hints = await dbApi.hintTables.request({ id: this.id, db: db.name });
|
||||
hints = await dbApi.hintTables.request({id: this.id, db: db.name});
|
||||
db.tableHints = hints;
|
||||
hintsStorage.value.set(key, hints);
|
||||
return hints;
|
||||
@@ -261,7 +262,8 @@ export class DbInst {
|
||||
* @returns count sql
|
||||
*/
|
||||
getDefaultCountSql = (table: string, condition?: string) => {
|
||||
return `SELECT COUNT(*) count FROM ${this.wrapName(table)} ${condition ? 'WHERE ' + condition : ''}`;
|
||||
return `SELECT COUNT(*) count
|
||||
FROM ${this.wrapName(table)} ${condition ? 'WHERE ' + condition : ''}`;
|
||||
};
|
||||
|
||||
// 获取指定表的默认查询sql
|
||||
@@ -303,7 +305,8 @@ export class DbInst {
|
||||
colNames.push(this.wrapName(colName));
|
||||
values.push(dbDialect.wrapValue(column.dataType, data[colName]));
|
||||
}
|
||||
sqls.push(`INSERT INTO ${schema}${this.wrapName(table)} (${colNames.join(', ')}) VALUES(${values.join(', ')})`);
|
||||
sqls.push(`INSERT INTO ${schema}${this.wrapName(table)} (${colNames.join(', ')})
|
||||
VALUES (${values.join(', ')})`);
|
||||
}
|
||||
return sqls.join(';\n') + ';';
|
||||
}
|
||||
@@ -322,7 +325,8 @@ export class DbInst {
|
||||
schema = this.wrapName(dbArr[1]) + '.';
|
||||
}
|
||||
|
||||
let sql = `UPDATE ${schema}${this.wrapName(table)} SET `;
|
||||
let sql = `UPDATE ${schema}${this.wrapName(table)}
|
||||
SET `;
|
||||
// 主键列信息
|
||||
const primaryKey = await this.loadTableColumn(dbName, table);
|
||||
let primaryKeyType = primaryKey.dataType;
|
||||
@@ -350,7 +354,9 @@ export class DbInst {
|
||||
const primaryKey = await this.loadTableColumn(db, table);
|
||||
const primaryKeyColumnName = primaryKey.columnName;
|
||||
const ids = datas.map((d: any) => `${this.getDialect().wrapValue(primaryKey.dataType, d[primaryKeyColumnName])}`).join(',');
|
||||
return `DELETE FROM ${this.wrapName(table)} WHERE ${this.wrapName(primaryKeyColumnName)} IN (${ids})`;
|
||||
return `DELETE
|
||||
FROM ${this.wrapName(table)}
|
||||
WHERE ${this.wrapName(primaryKeyColumnName)} IN (${ids})`;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -404,7 +410,7 @@ export class DbInst {
|
||||
dbInst.databases = inst.databases;
|
||||
|
||||
if (dbInst.databases?.[0]) {
|
||||
dbInst.version = await dbApi.getCompatibleDbVersion.request({ id: inst.id, db: dbInst.databases?.[0] });
|
||||
dbInst.version = await dbApi.getCompatibleDbVersion.request({id: inst.id, db: dbInst.databases?.[0]});
|
||||
}
|
||||
|
||||
dbInstCache.set(dbInst.id, dbInst);
|
||||
@@ -441,7 +447,7 @@ export class DbInst {
|
||||
return Promise.resolve(dbInst);
|
||||
}
|
||||
|
||||
const dbInfoRes = await dbApi.dbs.request({ id: dbId });
|
||||
const dbInfoRes = await dbApi.dbs.request({id: dbId});
|
||||
const db = dbInfoRes.list[0];
|
||||
return Promise.resolve(DbInst.getOrNewInst(db));
|
||||
}
|
||||
@@ -459,7 +465,7 @@ export class DbInst {
|
||||
* @returns
|
||||
*/
|
||||
static isNumber(columnType: string) {
|
||||
return columnType && columnType.match(/int|double|float|number|decimal|byte|bit/gi);
|
||||
return columnType && columnType.match(/^(int|uint|double|float|number|decimal|byte|bit)/i);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -539,7 +545,7 @@ export class DbInst {
|
||||
return db.database.split(' ');
|
||||
}
|
||||
|
||||
return await dbApi.getDbNamesByAc.request({ authCertName: db.authCertName });
|
||||
return await dbApi.getDbNamesByAc.request({authCertName: db.authCertName});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -647,9 +653,9 @@ function registerCompletions(
|
||||
) {
|
||||
// mysql关键字
|
||||
completions.forEach((item: EditorCompletionItem) => {
|
||||
let { label, insertText, description } = item;
|
||||
let {label, insertText, description} = item;
|
||||
suggestions.push({
|
||||
label: { label, description },
|
||||
label: {label, description},
|
||||
kind,
|
||||
insertText: insertText || label,
|
||||
range,
|
||||
@@ -668,20 +674,20 @@ function registerCompletions(
|
||||
export function registerDbCompletionItemProvider(dbId: number, db: string, dbs: any[] = [], dbType: string) {
|
||||
let dbDialect = getDbDialect(dbType);
|
||||
let dbDialectInfo = dbDialect.getInfo();
|
||||
let { keywords, operators, functions, variables } = dbDialectInfo.editorCompletions;
|
||||
let {keywords, operators, functions, variables} = dbDialectInfo.editorCompletions;
|
||||
registerCompletionItemProvider('sql', {
|
||||
triggerCharacters: ['.', ' '],
|
||||
provideCompletionItems: async (model: editor.ITextModel, position: Position): Promise<languages.CompletionList | null | undefined> => {
|
||||
let word = model.getWordUntilPosition(position);
|
||||
const dbInst = await DbInst.getInstA(dbId);
|
||||
const { lineNumber, column } = position;
|
||||
const { startColumn, endColumn } = word;
|
||||
const {lineNumber, column} = position;
|
||||
const {startColumn, endColumn} = word;
|
||||
|
||||
// 当前行文本
|
||||
let lineContent = model.getLineContent(lineNumber);
|
||||
// 注释行不需要代码提示
|
||||
if (lineContent.startsWith('--')) {
|
||||
return { suggestions: [] };
|
||||
return {suggestions: []};
|
||||
}
|
||||
|
||||
let range = {
|
||||
@@ -806,7 +812,7 @@ export function registerDbCompletionItemProvider(dbId: number, db: string, dbs:
|
||||
// 当前库的表名联想
|
||||
const tables = await dbInst.loadTables(db);
|
||||
tables.forEach((tableMeta: any, index: any) => {
|
||||
const { tableName, tableComment } = tableMeta;
|
||||
const {tableName, tableComment} = tableMeta;
|
||||
suggestions.push({
|
||||
label: {
|
||||
label: tableName + ' - ' + tableComment,
|
||||
@@ -833,7 +839,11 @@ export function registerDbCompletionItemProvider(dbId: number, db: string, dbs:
|
||||
});
|
||||
}
|
||||
|
||||
function getTableName4SqlCtx(sql: string, alias: string = '', defaultDb: string): { tableName: string; tableAlias: string; db: string } | undefined {
|
||||
function getTableName4SqlCtx(sql: string, alias: string = '', defaultDb: string): {
|
||||
tableName: string;
|
||||
tableAlias: string;
|
||||
db: string
|
||||
} | undefined {
|
||||
// 去除多余的换行、空格和制表符
|
||||
sql = sql.replace(/[\r\n\s\t]+/g, ' ');
|
||||
|
||||
@@ -855,7 +865,7 @@ function getTableName4SqlCtx(sql: string, alias: string = '', defaultDb: string)
|
||||
tableName = info[1];
|
||||
}
|
||||
const tableAlias = matches[2] ? matches[2].replace(/[`"]/g, '') : tableName;
|
||||
tables.push({ tableName, tableAlias, db });
|
||||
tables.push({tableName, tableAlias, db});
|
||||
}
|
||||
|
||||
if (alias) {
|
||||
|
||||
@@ -54,6 +54,21 @@ const DM_TYPE_LIST: sqlColumnType[] = [
|
||||
{ udtName: 'BLOB', dataType: 'BLOB', desc: '变长的二进制大对象', space: '', range: '100G-1' },
|
||||
{ udtName: 'CLOB', dataType: 'CLOB', desc: '同TEXT', space: '', range: '100G-1' },
|
||||
{ udtName: 'BFILE', dataType: 'BFILE', desc: '二进制文件', space: '', range: '100G-1' },
|
||||
|
||||
// 达梦系统特有的字段类型 从 ALL_TYPES 表中查询得到
|
||||
{udtName: 'SYSGEO.ST_GEOMETRY', dataType: 'SYSGEO.ST_GEOMETRY', desc: '通用几何对象类型,可以表示点、线、面等任何几何形状', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_LINESTRING', dataType: 'SYSGEO.ST_LINESTRING', desc: '表示一条或多条连续的线段', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_CURVE', dataType: 'SYSGEO.ST_CURVE', desc: '表示一条曲线,可以是圆弧、抛物线等', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_GEOMCOLLECTION', dataType: 'SYSGEO.ST_GEOMCOLLECTION', desc: '表示一个几何对象集合,可以包含多个不同类型的几何对象', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_MULTICURVE', dataType: 'SYSGEO.ST_MULTICURVE', desc: '表示多个曲线的集合', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_MULTIPOINT', dataType: 'SYSGEO.ST_MULTIPOINT', desc: '表示多个点的集合', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_MULTISURFACE', dataType: 'SYSGEO.ST_MULTISURFACE', desc: '表示多个表面的集合', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_POINT', dataType: 'SYSGEO.ST_POINT', desc: '表示一个点', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_SURFACE', dataType: 'SYSGEO.ST_SURFACE', desc: '表示一个表面,通常是一个多边形', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_MULTILINESTRING', dataType: 'SYSGEO.ST_MULTILINESTRING', desc: '表示多个线串的集合', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_MULTIPOLYGON', dataType: 'SYSGEO.ST_MULTIPOLYGON', desc: '表示多个多边形的集合', space: '', range: ''},
|
||||
{udtName: 'SYSGEO.ST_POLYGON', dataType: 'SYSGEO.ST_POLYGON', desc: '表示一个多边形', space: '', range: ''},
|
||||
|
||||
];
|
||||
|
||||
// 参考官方文档:https://eco.dameng.com/document/dm/zh-cn/pm/function.html
|
||||
|
||||
@@ -3,8 +3,8 @@ module mayfly-go
|
||||
go 1.23.0
|
||||
|
||||
require (
|
||||
gitee.com/chunanyong/dm v1.8.16
|
||||
gitee.com/liuzongyang/libpq v1.0.9
|
||||
gitee.com/chunanyong/dm v1.8.17
|
||||
gitee.com/liuzongyang/libpq v1.10.11
|
||||
github.com/antlr4-go/antlr/v4 v4.13.1
|
||||
github.com/emirpasic/gods v1.18.1
|
||||
github.com/gin-gonic/gin v1.10.0
|
||||
|
||||
@@ -3,10 +3,13 @@ package dbi
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
"encoding/hex"
|
||||
"fmt"
|
||||
"gitee.com/chunanyong/dm"
|
||||
"mayfly-go/internal/machine/mcm"
|
||||
"mayfly-go/pkg/errorx"
|
||||
"mayfly-go/pkg/logx"
|
||||
"mayfly-go/pkg/utils/anyx"
|
||||
"reflect"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -173,7 +176,6 @@ func walkQueryRows(ctx context.Context, db *sql.DB, selectSql string, walkFn Wal
|
||||
// 这里表示一行填充数据
|
||||
scans := make([]any, lenCols)
|
||||
// 这里表示一行所有列的值,用[]byte表示
|
||||
values := make([][]byte, lenCols)
|
||||
for k, colType := range colTypes {
|
||||
// 处理字段名,如果为空,则命名为匿名列
|
||||
colName := colType.Name()
|
||||
@@ -182,7 +184,13 @@ func walkQueryRows(ctx context.Context, db *sql.DB, selectSql string, walkFn Wal
|
||||
}
|
||||
cols[k] = &QueryColumn{Name: colName, Type: colType.DatabaseTypeName()}
|
||||
// 这里scans引用values,把数据填充到[]byte里
|
||||
scans[k] = &values[k]
|
||||
if cols[k].Type == "st_point" { // 达梦的空间坐标数据
|
||||
var point dm.DmStruct
|
||||
scans[k] = &point
|
||||
} else {
|
||||
var s = make([]byte, 0)
|
||||
scans[k] = &s
|
||||
}
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
@@ -193,7 +201,7 @@ func walkQueryRows(ctx context.Context, db *sql.DB, selectSql string, walkFn Wal
|
||||
// 每行数据
|
||||
rowData := make(map[string]any, lenCols)
|
||||
// 把values中的数据复制到row中
|
||||
for i, v := range values {
|
||||
for i, v := range scans {
|
||||
rowData[cols[i].Name] = valueConvert(v, colTypes[i])
|
||||
}
|
||||
if err = walkFn(rowData, cols); err != nil {
|
||||
@@ -206,27 +214,67 @@ func walkQueryRows(ctx context.Context, db *sql.DB, selectSql string, walkFn Wal
|
||||
return cols, nil
|
||||
}
|
||||
|
||||
func ParseDmStruct(dmStruct *dm.DmStruct) string {
|
||||
if !dmStruct.Valid {
|
||||
return ""
|
||||
}
|
||||
|
||||
name, _ := dmStruct.GetSQLTypeName()
|
||||
attributes, _ := dmStruct.GetAttributes()
|
||||
arr := make([]string, len(attributes))
|
||||
arr = append(arr, name, "(")
|
||||
|
||||
for i, v := range attributes {
|
||||
if blb, ok1 := v.(*dm.DmBlob); ok1 {
|
||||
if blb.Valid {
|
||||
length, _ := blb.GetLength()
|
||||
var dest = make([]byte, length)
|
||||
_, _ = blb.Read(dest)
|
||||
// 2进制转16进制字符串
|
||||
hexStr := hex.EncodeToString(dest)
|
||||
arr = append(arr, "0x", strings.ToUpper(hexStr))
|
||||
}
|
||||
} else {
|
||||
arr = append(arr, anyx.ToString(v))
|
||||
}
|
||||
if i < len(attributes)-1 {
|
||||
arr = append(arr, ",")
|
||||
}
|
||||
}
|
||||
|
||||
arr = append(arr, ")")
|
||||
return strings.Join(arr, "")
|
||||
|
||||
}
|
||||
|
||||
// 将查询的值转为对应列类型的实际值,不全部转为字符串
|
||||
func valueConvert(data []byte, colType *sql.ColumnType) any {
|
||||
func valueConvert(data interface{}, colType *sql.ColumnType) any {
|
||||
if data == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 达梦特殊数据类型
|
||||
if dmStruct, ok := data.(*dm.DmStruct); ok {
|
||||
return ParseDmStruct(dmStruct)
|
||||
}
|
||||
|
||||
// 列的数据库类型名
|
||||
colDatabaseTypeName := strings.ToLower(colType.DatabaseTypeName())
|
||||
|
||||
// 如果类型是bit,则直接返回第一个字节即可
|
||||
if strings.Contains(colDatabaseTypeName, "bit") {
|
||||
return data[0]
|
||||
}
|
||||
if colDatabaseTypeName == "blob" {
|
||||
return fmt.Sprintf("%x", data)
|
||||
// 这里把[]byte数据转成string
|
||||
stringV := ""
|
||||
if slicePtr, ok := data.(*[]uint8); ok {
|
||||
stringV = string(*slicePtr)
|
||||
// 如果类型是bit,则直接返回第一个字节即可
|
||||
if strings.Contains(colDatabaseTypeName, "bit") {
|
||||
return (*slicePtr)[0]
|
||||
}
|
||||
|
||||
if colDatabaseTypeName == "blob" {
|
||||
return hex.EncodeToString(*slicePtr)
|
||||
}
|
||||
}
|
||||
|
||||
// 这里把[]byte数据转成string
|
||||
stringV := string(data)
|
||||
if stringV == "" {
|
||||
return ""
|
||||
}
|
||||
if colType == nil || colType.ScanType() == nil {
|
||||
return stringV
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ select a.owner,
|
||||
a.table_name as TABLE_NAME,
|
||||
a.column_name as COLUMN_NAME,
|
||||
case when a.NULLABLE = 'Y' then 'YES' when a.NULLABLE = 'N' then 'NO' else 'NO' end as NULLABLE,
|
||||
a.data_type as DATA_TYPE,
|
||||
case when t3.TYPE_NAME != '' then 'SYSGEO.' || UPPER(t3.TYPE_NAME) else a.DATA_TYPE end as DATA_TYPE,
|
||||
a.char_col_decl_length as CHAR_MAX_LENGTH,
|
||||
a.data_precision as NUM_PRECISION,
|
||||
a.data_scale as NUM_SCALE,
|
||||
@@ -77,6 +77,7 @@ from all_tab_columns a
|
||||
from all_ind_columns uic
|
||||
left join all_constraints uc on uic.index_name = uc.index_name) t2
|
||||
on t2.table_name = t.object_name and a.column_name = t2.column_name and t2.OWNER = a.owner
|
||||
left join USER_TYPES t3 ON ('CLASS' || t3.TYPEID) = a.DATA_TYPE
|
||||
where a.owner = (SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID))
|
||||
and a.table_name in (%s)
|
||||
order by a.table_name,
|
||||
|
||||
@@ -230,11 +230,11 @@ func (dd *DMDialect) GenerateIndexDDL(indexs []dbi.Index, tableInfo dbi.Table) [
|
||||
}
|
||||
|
||||
func (dd *DMDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (dd *DMDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (dd *DMDialect) GetDumpHelper() dbi.DumpHelper {
|
||||
|
||||
@@ -74,8 +74,14 @@ var (
|
||||
dbi.CommonTypeEnum: "TEXT",
|
||||
dbi.CommonTypeJSON: "TEXT",
|
||||
}
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
@@ -371,11 +371,11 @@ func (dx *MssqlDialect) RemoveQuote(name string) string {
|
||||
}
|
||||
|
||||
func (md *MssqlDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (md *MssqlDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (md *MssqlDialect) GetDumpHelper() dbi.DumpHelper {
|
||||
|
||||
@@ -84,8 +84,14 @@ var (
|
||||
dbi.CommonTypeEnum: "nvarchar",
|
||||
dbi.CommonTypeJSON: "nvarchar",
|
||||
}
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
@@ -209,11 +209,11 @@ func (md *MysqlDialect) QuoteLiteral(literal string) string {
|
||||
}
|
||||
|
||||
func (md *MysqlDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (md *MysqlDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (pd *MysqlDialect) GetSQLParser() sqlparser.SqlParser {
|
||||
|
||||
@@ -75,8 +75,14 @@ var (
|
||||
dbi.CommonTypeEnum: "enum",
|
||||
dbi.CommonTypeJSON: "json",
|
||||
}
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
@@ -256,11 +256,11 @@ func (od *OracleDialect) GenerateTableOtherDDL(tableInfo dbi.Table, quoteTableNa
|
||||
}
|
||||
|
||||
func (od *OracleDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (od *OracleDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (od *OracleDialect) genColumnBasicSql(column dbi.Column) string {
|
||||
|
||||
@@ -68,8 +68,15 @@ var (
|
||||
dbi.CommonTypeEnum: "CLOB",
|
||||
dbi.CommonTypeJSON: "CLOB",
|
||||
}
|
||||
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
@@ -282,11 +282,11 @@ func (pd *PgsqlDialect) UpdateSequence(tableName string, columns []dbi.Column) {
|
||||
}
|
||||
|
||||
func (pd *PgsqlDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (pd *PgsqlDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (pd *PgsqlDialect) GetDumpHelper() dbi.DumpHelper {
|
||||
|
||||
@@ -73,8 +73,14 @@ var (
|
||||
dbi.CommonTypeEnum: "varchar(2000)",
|
||||
dbi.CommonTypeJSON: "varchar(2000)",
|
||||
}
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
@@ -171,11 +171,11 @@ func (sd *SqliteDialect) GenerateIndexDDL(indexs []dbi.Index, tableInfo dbi.Tabl
|
||||
}
|
||||
|
||||
func (sd *SqliteDialect) GetDataHelper() dbi.DataHelper {
|
||||
return new(DataHelper)
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
func (sd *SqliteDialect) GetColumnHelper() dbi.ColumnHelper {
|
||||
return new(ColumnHelper)
|
||||
return columnHelper
|
||||
}
|
||||
|
||||
func (sd *SqliteDialect) GetDumpHelper() dbi.DumpHelper {
|
||||
|
||||
@@ -74,8 +74,14 @@ var (
|
||||
dbi.CommonTypeEnum: "nvarchar(2000)",
|
||||
dbi.CommonTypeJSON: "nvarchar(2000)",
|
||||
}
|
||||
dataHelper = &DataHelper{}
|
||||
columnHelper = &ColumnHelper{}
|
||||
)
|
||||
|
||||
func GetDataHelper() *DataHelper {
|
||||
return dataHelper
|
||||
}
|
||||
|
||||
type DataHelper struct {
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user