UNPKG

forest-cli

Version:

The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.

294 lines 16.9 kB
const MysqlTableConstraintsGetter = require('./mysql-table-constraints-getter'); function TableConstraintsGetter(databaseConnection, schema) { const queryInterface = databaseConnection.getQueryInterface(); this.perform = async (table) => { let query = null; const replacements = { table }; switch (queryInterface.sequelize.options.dialect) { case 'postgres': query = ` SELECT "tableConstraints".constraint_name AS "constraintName", "tableConstraints".table_name AS "tableName", "tableConstraints".constraint_type AS "columnType", "keyColumnUsage".column_name AS "columnName", "constraintColumnUsage".table_name AS "foreignTableName", "constraintColumnUsage".column_name AS "foreignColumnName", json_agg("uidx"."uniqueIndexes") filter (where "uidx"."uniqueIndexes" is not null) AS "uniqueIndexes" FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS "tableConstraints" JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS "keyColumnUsage" ON "tableConstraints".constraint_name = "keyColumnUsage".constraint_name COLLATE "default" JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS "constraintColumnUsage" ON "constraintColumnUsage".constraint_name = "tableConstraints".constraint_name FULL OUTER JOIN ( -- Get the index name, table name and list of columns of the unique indexes of a table SELECT pg_index.indexrelid::regclass AS "indexName", "pgClass1".relname AS "tableName", json_agg(DISTINCT pg_attribute.attname) AS "uniqueIndexes" FROM pg_class AS "pgClass1", pg_class AS "pgClass2", pg_index, pg_attribute WHERE "pgClass1".relname = :table AND "pgClass1".oid = pg_index.indrelid AND "pgClass2".oid = pg_index.indexrelid AND pg_attribute.attrelid = "pgClass1".oid AND pg_attribute.attnum = ANY(pg_index.indkey) AND not pg_index.indisprimary AND pg_index.indisunique AND "pgClass1".relkind = 'r' AND not "pgClass1".relname like 'pg%' GROUP BY "tableName", "indexName" ) AS "uidx" ON "uidx"."tableName" = "tableConstraints".table_name WHERE "uidx"."tableName" = :table OR "tableConstraints".table_name = :table GROUP BY "constraintName", "tableConstraints".table_name, "columnType", "columnName", "foreignTableName", "foreignColumnName"`; break; case 'mysql': return new MysqlTableConstraintsGetter(databaseConnection).perform(table); case 'mssql': query = ` SELECT "constraintName", "tableName", "columnName", "columnType", "foreignTableName", "foreignColumnName", CASE WHEN '[]' = "uniqueIndexes" THEN NULL ELSE "uniqueIndexes" END AS "uniqueIndexes" FROM ( SELECT "constraintsTable"."constraintName", "constraintsTable"."tableName", "constraintsTable"."columnName", "constraintsTable"."columnType", "constraintsTable"."foreignTableName", "constraintsTable"."foreignColumnName", CONCAT ( '[', STUFF(( SELECT ', ' + "constraintsAndIndexes"."uniqueIndexes" FROM ( SELECT "constraintColumnUsage".constraint_name AS "constraintName", "constraintColumnUsage".table_name AS "tableName", "tableConstraints".constraint_type AS "columnType", "constraintColumnUsage".column_name AS "columnName", "keyColumnUsage".table_name AS "foreignTableName", "keyColumnUsage".column_name AS "foreignColumnName", "uidx"."uniqueIndexes" FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS "tableConstraints" JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE "constraintColumnUsage" ON "constraintColumnUsage".constraint_name = "tableConstraints".constraint_name LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS "referentialConstraints" ON "constraintColumnUsage".constraint_name = "referentialConstraints".constraint_name LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE "keyColumnUsage" ON "keyColumnUsage".constraint_name = "referentialConstraints".unique_constraint_name LEFT OUTER JOIN ( SELECT "indexesList1"."ind_name", "indexesList1"."t_name", CONCAT ( '[', STUFF(( SELECT ', ' + CONCAT ( '"', "indexesList2"."uniqueIndexes", '"' ) FROM ( SELECT "tables".name AS "t_name", "indexes".name AS "ind_name", "columns".name AS "uniqueIndexes" FROM sys.indexes "indexes" JOIN sys.index_columns "indexColumns" ON "indexes".object_id = "indexColumns".object_id AND "indexes".index_id = "indexColumns".index_id JOIN sys.tables "tables" ON "indexes".object_id = "tables".object_id JOIN sys.columns "columns" ON "indexColumns".object_id = "columns".object_id AND "indexColumns".column_id = "columns".column_id WHERE "indexes".is_primary_key = 0 AND ( "indexes".is_unique = 1 OR "indexes".is_unique_constraint = 1 ) ) "indexesList2" WHERE "indexesList2"."t_name" = "indexesList1"."t_name" AND "indexesList2"."ind_name" = "indexesList1"."ind_name" FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, ''), ']' ) AS "uniqueIndexes" FROM ( SELECT "tables".name AS "t_name", "indexes".name AS "ind_name", "columns".name FROM sys.indexes "indexes" JOIN sys.index_columns "indexColumns" ON "indexes".object_id = "indexColumns".object_id AND "indexes".index_id = "indexColumns".index_id JOIN sys.tables "tables" ON "indexes".object_id = "tables".object_id JOIN sys.columns "columns" ON "indexColumns".object_id = "columns".object_id AND "indexColumns".column_id = "columns".column_id WHERE "indexes".is_primary_key = 0 AND ( "indexes".is_unique = 1 OR "indexes".is_unique_constraint = 1 ) ) "indexesList1" GROUP BY "indexesList1"."t_name", "indexesList1"."ind_name" ) "uidx" ON "uidx"."t_name" = "tableConstraints".table_name WHERE "constraintColumnUsage".table_name = '${table}' AND "constraintColumnUsage".table_schema = '${schema !== undefined ? schema : 'dbo'}' ) "constraintsAndIndexes" WHERE "constraintsTable"."tableName" = "constraintsAndIndexes"."tableName" AND "constraintsTable"."columnType" = "constraintsAndIndexes"."columnType" AND "constraintsTable"."columnName" = "constraintsAndIndexes"."columnName" FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, ''), ']' ) AS "uniqueIndexes" FROM ( SELECT "constraintColumnUsage".constraint_name AS "constraintName", "constraintColumnUsage".table_name AS "tableName", "tableConstraints".constraint_type AS "columnType", "constraintColumnUsage".column_name AS "columnName", "keyColumnUsage".table_name AS "foreignTableName", "keyColumnUsage".column_name AS "foreignColumnName" FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS "tableConstraints" JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE "constraintColumnUsage" ON "constraintColumnUsage".constraint_name = "tableConstraints".constraint_name LEFT OUTER JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS "referentialConstraints" ON "constraintColumnUsage".constraint_name = "referentialConstraints".constraint_name LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE "keyColumnUsage" ON "keyColumnUsage".constraint_name = "referentialConstraints".unique_constraint_name LEFT OUTER JOIN ( SELECT "indexesList1"."ind_name", "indexesList1"."t_name", CONCAT ( '[', STUFF(( SELECT ', ' + CONCAT ( '"', "indexesList2"."uniqueIndexes", '"' ) FROM ( SELECT "tables".name AS "t_name", "indexes".name AS "ind_name", "columns".name AS "uniqueIndexes" FROM sys.indexes "indexes" JOIN sys.index_columns "indexColumns" ON "indexes".object_id = "indexColumns".object_id AND "indexes".index_id = "indexColumns".index_id JOIN sys.tables "tables" ON "indexes".object_id = "tables".object_id JOIN sys.columns "columns" ON "indexColumns".object_id = "columns".object_id AND "indexColumns".column_id = "columns".column_id WHERE "indexes".is_primary_key = 0 AND ( "indexes".is_unique = 1 OR "indexes".is_unique_constraint = 1 ) ) "indexesList2" WHERE "indexesList2"."t_name" = "indexesList1"."t_name" AND "indexesList2"."ind_name" = "indexesList1"."ind_name" FOR XML PATH(''), TYPE ).value('.', 'varchar(max)'), 1, 2, ''), ']' ) AS "uniqueIndexes" FROM ( SELECT "tables".name AS "t_name", "indexes".name AS "ind_name", "columns".name FROM sys.indexes "indexes" JOIN sys.index_columns "indexColumns" ON "indexes".object_id = "indexColumns".object_id AND "indexes".index_id = "indexColumns".index_id JOIN sys.tables "tables" ON "indexes".object_id = "tables".object_id JOIN sys.columns "columns" ON "indexColumns".object_id = "columns".object_id AND "indexColumns".column_id = "columns".column_id WHERE "indexes".is_primary_key = 0 AND ( "indexes".is_unique = 1 OR "indexes".is_unique_constraint = 1 ) ) "indexesList1" GROUP BY "indexesList1"."t_name", "indexesList1"."ind_name" ) "uidx" ON "uidx"."t_name" = "constraintColumnUsage".table_name WHERE "constraintColumnUsage".table_name = '${table}' AND "constraintColumnUsage".table_schema = '${schema !== undefined ? schema : 'dbo'}' ) AS "constraintsTable" GROUP BY "constraintsTable"."constraintName", "constraintsTable"."tableName", "constraintsTable"."columnType", "constraintsTable"."columnName", "constraintsTable"."foreignTableName", "constraintsTable"."foreignColumnName" ) "alias" GROUP BY "constraintName", "tableName", "columnName", "columnType", "foreignTableName", "foreignColumnName", "uniqueIndexes"`; break; default: break; } const constraints = await queryInterface.sequelize.query(query, { type: queryInterface.sequelize.QueryTypes.SELECT, replacements, }); // NOTICE: MSSQL doesn't support aggregation to JSON, we need to parse it. return constraints.map(constraint => { let { uniqueIndexes } = constraint; if (uniqueIndexes !== null && typeof uniqueIndexes === 'string') { uniqueIndexes = JSON.parse(uniqueIndexes); } return { ...constraint, uniqueIndexes }; }); }; } module.exports = TableConstraintsGetter; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VxdWVsaXplLXRhYmxlLWNvbnN0cmFpbnRzLWdldHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9zY2hlbWEvdXBkYXRlL2FuYWx5emVyL3NlcXVlbGl6ZS10YWJsZS1jb25zdHJhaW50cy1nZXR0ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSwyQkFBMkIsR0FBRyxPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQztBQUVoRixTQUFTLHNCQUFzQixDQUFDLGtCQUFrQixFQUFFLE1BQU07SUFDeEQsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUU5RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssRUFBQyxLQUFLLEVBQUMsRUFBRTtRQUMzQixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsTUFBTSxZQUFZLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQztRQUUvQixRQUFRLGNBQWMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNoRCxLQUFLLFVBQVU7Z0JBQ2IsS0FBSyxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0ErQ2dCLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixLQUFLLE9BQU87Z0JBQ1YsT0FBTyxJQUFJLDJCQUEyQixDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVFLEtBQUssT0FBTztnQkFDVixLQUFLLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrRUF5R2tELEtBQUs7b0VBRS9DLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzREQXlGc0MsS0FBSzs4REFFL0MsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUNsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7NEJBaUJZLENBQUM7Z0JBQ3JCLE1BQU07WUFDUjtnQkFDRSxNQUFNO1NBQ1Q7UUFFRCxNQUFNLFdBQVcsR0FBRyxNQUFNLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRTtZQUM5RCxJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTTtZQUNoRCxZQUFZO1NBQ2IsQ0FBQyxDQUFDO1FBRUgsMEVBQTBFO1FBQzFFLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQyxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsVUFBVSxDQUFDO1lBQ25DLElBQUksYUFBYSxLQUFLLElBQUksSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7Z0JBQy9ELGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNDO1lBRUQsT0FBTyxFQUFFLEdBQUcsVUFBVSxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQzFDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxPQUFPLEdBQUcsc0JBQXNCLENBQUMifQ==