feat: show table definition (#3061)

* feat: show table definition

* chore: test
This commit is contained in:
ChengLei Shao 2023-11-20 09:58:28 +08:00 committed by GitHub
parent d7d2eb634e
commit 57d6a82fcc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 46 additions and 0 deletions

View File

@ -76,4 +76,14 @@ export default class MysqlQueryInterface extends QueryInterface {
const sql = match[0]; const sql = match[0];
return sql; return sql;
} }
async showTableDefinition(tableInfo: { name: string; schema?: string }): Promise<any> {
const { name } = tableInfo;
const sql = `SHOW CREATE TABLE ${name}`;
const results = await this.db.sequelize.query(sql, { type: 'SELECT' });
return results[0]['Create Table'];
}
} }

View File

@ -112,4 +112,34 @@ export default class PostgresQueryInterface extends QueryInterface {
return {}; return {};
} }
} }
async showTableDefinition(tableInfo: { name: string; schema?: string }) {
const showFunc = `
CREATE OR REPLACE FUNCTION show_create_table(p_schema text, p_table_name text)
RETURNS text AS
$BODY$
SELECT 'CREATE TABLE ' || p_schema || '.' || p_table_name || ' (' || E'\\n' || '' ||
string_agg(column_list.column_expr, ', ' || E'\\n' || '') ||
'' || E'\\n' || ');'
FROM (
SELECT ' ' || column_name || ' ' || data_type ||
coalesce('(' || character_maximum_length || ')', '') ||
case when is_nullable = 'YES' then '' else ' NOT NULL' end as column_expr
FROM information_schema.columns
WHERE table_schema = p_schema AND table_name = p_table_name
ORDER BY ordinal_position) column_list;
$BODY$
LANGUAGE SQL STABLE;
`;
await this.db.sequelize.query(showFunc, { type: 'RAW' });
const res = await this.db.sequelize.query(
`SELECT show_create_table('${tableInfo.schema}', '${tableInfo.name || 'public'}')`,
{
type: 'SELECT',
},
);
return res[0]['show_create_table'];
}
} }

View File

@ -25,6 +25,8 @@ export default abstract class QueryInterface {
abstract parseSQL(sql: string): any; abstract parseSQL(sql: string): any;
abstract showTableDefinition(tableInfo: { name: string; schema?: string }): Promise<any>;
async dropAll(options) { async dropAll(options) {
if (options.drop !== true) return; if (options.drop !== true) return;

View File

@ -86,4 +86,8 @@ export default class SqliteQueryInterface extends QueryInterface {
return sql; return sql;
} }
showTableDefinition(tableInfo: { name: string; schema?: string }): Promise<any> {
return Promise.resolve(undefined);
}
} }