Merge pull request #74 from kanzihuang/fix-showcreatetable

fix: show create table for postgres
This commit is contained in:
may-fly
2023-10-20 21:15:54 +08:00
committed by GitHub
4 changed files with 30 additions and 25 deletions

View File

@@ -319,28 +319,21 @@ func (d *Db) DumpSql(rc *req.Ctx) {
writer.Close() writer.Close()
}() }()
for _, dbName := range dbNames { for _, dbName := range dbNames {
d.dumpDb(writer, dbId, dbName, tables, needStruct, needData, len(dbNames) > 1) d.dumpDb(writer, dbId, dbName, tables, needStruct, needData)
} }
rc.ReqParam = collx.Kvs("db", db, "databases", dbNamesStr, "tables", tablesStr, "dumpType", dumpType) rc.ReqParam = collx.Kvs("db", db, "databases", dbNamesStr, "tables", tablesStr, "dumpType", dumpType)
} }
func (d *Db) dumpDb(writer *gzipWriter, dbId uint64, dbName string, tables []string, needStruct bool, needData bool, switchDb bool) { func (d *Db) dumpDb(writer *gzipWriter, dbId uint64, dbName string, tables []string, needStruct bool, needData bool) {
dbConn := d.DbApp.GetDbConnection(dbId, dbName) dbConn := d.DbApp.GetDbConnection(dbId, dbName)
writer.WriteString("\n-- ----------------------------") writer.WriteString("\n-- ----------------------------")
writer.WriteString("\n-- 导出平台: mayfly-go") writer.WriteString("\n-- 导出平台: mayfly-go")
writer.WriteString(fmt.Sprintf("\n-- 导出时间: %s ", time.Now().Format("2006-01-02 15:04:05"))) writer.WriteString(fmt.Sprintf("\n-- 导出时间: %s ", time.Now().Format("2006-01-02 15:04:05")))
writer.WriteString(fmt.Sprintf("\n-- 导出数据库: %s ", dbName)) writer.WriteString(fmt.Sprintf("\n-- 导出数据库: %s ", dbName))
writer.WriteString("\n-- ----------------------------\n") writer.WriteString("\n-- ----------------------------\n\n")
if switchDb { writer.WriteString(dbConn.Info.Type.StmtUseDatabase(dbName))
switch dbConn.Info.Type {
case entity.DbTypeMysql:
writer.WriteString(fmt.Sprintf("USE %s;\n", entity.DbTypeMysql.QuoteIdentifier(dbName)))
default:
biz.IsTrue(false, "同时导出多个数据库,数据库类型必须为 %s", entity.DbTypeMysql)
}
}
writer.WriteString(dbConn.Info.Type.StmtSetForeignKeyChecks(false)) writer.WriteString(dbConn.Info.Type.StmtSetForeignKeyChecks(false))
dbMeta := dbConn.GetMeta() dbMeta := dbConn.GetMeta()
@@ -358,7 +351,7 @@ func (d *Db) dumpDb(writer *gzipWriter, dbId uint64, dbName string, tables []str
if needStruct { if needStruct {
writer.WriteString(fmt.Sprintf("\n-- ----------------------------\n-- 表结构: %s \n-- ----------------------------\n", table)) writer.WriteString(fmt.Sprintf("\n-- ----------------------------\n-- 表结构: %s \n-- ----------------------------\n", table))
writer.WriteString(fmt.Sprintf("DROP TABLE IF EXISTS %s;\n", quotedTable)) writer.WriteString(fmt.Sprintf("DROP TABLE IF EXISTS %s;\n", quotedTable))
writer.WriteString(dbMeta.GetCreateTableDdl(table) + ";\n") writer.WriteString(dbMeta.GetCreateTableDdl(table) + "\n")
} }
if !needData { if !needData {
continue continue

View File

@@ -75,7 +75,7 @@ ORDER BY
-- columns -- columns
tableScript:=tableScript || ' CREATE TABLE '|| tablename|| ' ( '|| chr(13)||chr(10) || array_to_string( tableScript:=tableScript || ' CREATE TABLE '|| tablename|| ' ( '|| chr(13)||chr(10) || array_to_string(
array( array(
select ' ' || concat_ws(' ',fieldName, fieldType, fieldLen, indexType, isNullStr, fieldComment ) as column_line select ' ' || concat_ws(' ',fieldName, fieldType, isNullStr ) as column_line
from ( from (
select a.attname as fieldName,format_type(a.atttypid,a.atttypmod) as fieldType,(case when atttypmod-4>0 then select a.attname as fieldName,format_type(a.atttypid,a.atttypmod) as fieldType,(case when atttypmod-4>0 then
atttypmod-4 else 0 end) as fieldLen, atttypmod-4 else 0 end) as fieldLen,
@@ -91,10 +91,11 @@ ORDER BY
from pg_attribute a where attstattarget=-1 and attrelid = (select c.oid from pg_class c,pg_namespace n where from pg_attribute a where attstattarget=-1 and attrelid = (select c.oid from pg_class c,pg_namespace n where
c.relnamespace=n.oid and n.nspname =namespace and relname =tablename) c.relnamespace=n.oid and n.nspname =namespace and relname =tablename)
) as string_columns ) as string_columns
),','||chr(13)||chr(10)) || ','; ),','||chr(13)||chr(10));
-- 约束 -- 约束
tableScript:= tableScript || chr(13)||chr(10) || array_to_string( tableScript:= tableScript || array_to_string(
array( array(
select '' union all
select concat(' CONSTRAINT ',conname ,c ,u,p,f) from ( select concat(' CONSTRAINT ',conname ,c ,u,p,f) from (
select conname, select conname,
case when contype='c' then ' CHECK('|| ( select findattname(namespace,tablename,'c') ) ||')' end as c , case when contype='c' then ' CHECK('|| ( select findattname(namespace,tablename,'c') ) ||')' end as c ,
@@ -117,7 +118,7 @@ ORDER BY
/** **/ /** **/
--- 获取非约束索引 column --- 获取非约束索引 column
-- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language -- CREATE UNIQUE INDEX pg_language_oid_index ON pg_language USING btree (oid); -- table pg_language
tableScript:= tableScript || chr(13)||chr(10) || chr(13)||chr(10) || array_to_string( tableScript:= tableScript || chr(13)||chr(10) || array_to_string(
array( array(
select 'CREATE INDEX ' || indexrelname || ' ON ' || tablename || ' USING btree '|| '(' || attname || ');' from ( select 'CREATE INDEX ' || indexrelname || ' ON ' || tablename || ' USING btree '|| '(' || attname || ');' from (
SELECT SELECT
@@ -134,16 +135,16 @@ ORDER BY
WHERE c.relname=tablename and i.relname not in WHERE c.relname=tablename and i.relname not in
( select constraint_name from information_schema.key_column_usage where table_name=tablename ) ( select constraint_name from information_schema.key_column_usage where table_name=tablename )
)as t )as t
) ,','|| chr(13)||chr(10)); ) , chr(13)||chr(10));
-- COMMENT COMMENT ON COLUMN sys_activity.id IS '主键'; -- COMMENT ON COLUMN sys_activity.id IS '主键';
tableScript:= tableScript || chr(13)||chr(10) || chr(13)||chr(10) || array_to_string( tableScript:= tableScript || chr(13)||chr(10) || array_to_string(
array( array(
SELECT 'COMMENT ON COLUMN' || tablename || '.' || a.attname ||' IS '|| ''''|| d.description ||'''' SELECT 'COMMENT ON COLUMN ' || tablename || '.' || a.attname ||' IS '|| ''''|| d.description ||''';'
FROM pg_class c FROM pg_class c
JOIN pg_description d ON c.oid=d.objoid JOIN pg_description d ON c.oid=d.objoid
JOIN pg_attribute a ON c.oid = a.attrelid JOIN pg_attribute a ON c.oid = a.attrelid
WHERE c.relname=tablename WHERE c.relname=tablename
AND a.attnum = d.objsubid),','|| chr(13)||chr(10)) ; AND a.attnum = d.objsubid), chr(13)||chr(10)) ;
return tableScript; return tableScript;
end end
$BODY$ LANGUAGE plpgsql; $BODY$ LANGUAGE plpgsql;

View File

@@ -154,7 +154,7 @@ func (mm *MysqlMetadata) GetTableIndex(tableName string) []Index {
func (mm *MysqlMetadata) GetCreateTableDdl(tableName string) string { func (mm *MysqlMetadata) GetCreateTableDdl(tableName string) string {
_, res, err := mm.di.SelectData(fmt.Sprintf("show create table `%s` ", tableName)) _, res, err := mm.di.SelectData(fmt.Sprintf("show create table `%s` ", tableName))
biz.ErrIsNilAppendErr(err, "获取表结构失败: %s") biz.ErrIsNilAppendErr(err, "获取表结构失败: %s")
return res[0]["Create Table"].(string) return res[0]["Create Table"].(string) + ";"
} }
func (mm *MysqlMetadata) GetTableRecord(tableName string, pageNum, pageSize int) ([]string, []map[string]any, error) { func (mm *MysqlMetadata) GetTableRecord(tableName string, pageNum, pageSize int) ([]string, []map[string]any, error) {

View File

@@ -94,9 +94,9 @@ func (dbType DbType) StmtSetForeignKeyChecks(check bool) string {
switch dbType { switch dbType {
case DbTypeMysql: case DbTypeMysql:
if check { if check {
return "\nSET FOREIGN_KEY_CHECKS = 1;\n" return "SET FOREIGN_KEY_CHECKS = 1;\n"
} else { } else {
return "\nSET FOREIGN_KEY_CHECKS = 0;\n" return "SET FOREIGN_KEY_CHECKS = 0;\n"
} }
case DbTypePostgres: case DbTypePostgres:
// not currently supported postgres // not currently supported postgres
@@ -104,5 +104,16 @@ func (dbType DbType) StmtSetForeignKeyChecks(check bool) string {
default: default:
panic(fmt.Sprintf("invalid database type: %s", dbType)) panic(fmt.Sprintf("invalid database type: %s", dbType))
} }
}
func (dbType DbType) StmtUseDatabase(dbName string) string {
switch dbType {
case DbTypeMysql:
return fmt.Sprintf("USE %s;\n", dbType.QuoteIdentifier(dbName))
case DbTypePostgres:
// not currently supported postgres
return ""
default:
panic(fmt.Sprintf("invalid database type: %s", dbType))
}
} }