mirror of
https://gitee.com/nocobase/nocobase.git
synced 2024-12-02 04:07:50 +08:00
Fix/multiple schema query (#1488)
* fix: describeTableQuery in multiple schema database * fix: beforeUpdateCollection position
This commit is contained in:
parent
e0736f8aed
commit
e18bccd00a
@ -351,10 +351,10 @@ export class Collection<
|
||||
updateOptions(options: CollectionOptions, mergeOptions?: any) {
|
||||
let newOptions = lodash.cloneDeep(options);
|
||||
newOptions = merge(this.options, newOptions, mergeOptions);
|
||||
this.options = newOptions;
|
||||
|
||||
this.context.database.emit('beforeUpdateCollection', this, newOptions);
|
||||
|
||||
this.options = newOptions;
|
||||
|
||||
this.setFields(options.fields, false);
|
||||
this.setRepository(options.repository);
|
||||
|
||||
|
@ -83,36 +83,71 @@ export function snakeCase(name: string) {
|
||||
return require('sequelize').Utils.underscore(name);
|
||||
}
|
||||
|
||||
function patchShowConstraintsQuery(queryGenerator, db) {
|
||||
queryGenerator.showConstraintsQuery = (tableName, constraintName) => {
|
||||
const lines = [
|
||||
'SELECT constraint_catalog AS "constraintCatalog",',
|
||||
'constraint_schema AS "constraintSchema",',
|
||||
'constraint_name AS "constraintName",',
|
||||
'table_catalog AS "tableCatalog",',
|
||||
'table_schema AS "tableSchema",',
|
||||
'table_name AS "tableName",',
|
||||
'constraint_type AS "constraintType",',
|
||||
'is_deferrable AS "isDeferrable",',
|
||||
'initially_deferred AS "initiallyDeferred"',
|
||||
'from INFORMATION_SCHEMA.table_constraints',
|
||||
`WHERE table_name='${tableName}'`,
|
||||
];
|
||||
|
||||
if (!constraintName) {
|
||||
lines.push(`AND constraint_name='${constraintName}'`);
|
||||
}
|
||||
|
||||
if (db.options.schema && db.options.schema !== 'public') {
|
||||
lines.push(`AND table_schema='${db.options.schema}'`);
|
||||
}
|
||||
|
||||
return lines.join(' ');
|
||||
};
|
||||
}
|
||||
|
||||
function patchDescribeTableQuery(queryGenerator) {
|
||||
const describeTableQuery = function (tableName, schema) {
|
||||
schema = schema || this.options.schema || 'public';
|
||||
|
||||
return (
|
||||
'SELECT ' +
|
||||
'pk.constraint_type as "Constraint",' +
|
||||
'c.column_name as "Field", ' +
|
||||
'c.column_default as "Default",' +
|
||||
'c.is_nullable as "Null", ' +
|
||||
"(CASE WHEN c.udt_name = 'hstore' THEN c.udt_name ELSE c.data_type END) || (CASE WHEN c.character_maximum_length IS NOT NULL THEN '(' || c.character_maximum_length || ')' ELSE '' END) as \"Type\", " +
|
||||
'(SELECT array_agg(e.enumlabel) FROM pg_catalog.pg_type t JOIN pg_catalog.pg_enum e ON t.oid=e.enumtypid WHERE t.typname=c.udt_name) AS "special", ' +
|
||||
'(SELECT pgd.description FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description pgd on (pgd.objoid=st.relid) WHERE c.ordinal_position=pgd.objsubid AND c.table_name=st.relname AND st.schemaname = c.table_schema) AS "Comment" ' +
|
||||
'FROM information_schema.columns c ' +
|
||||
'LEFT JOIN (SELECT tc.table_schema, tc.table_name, ' +
|
||||
'cu.column_name, tc.constraint_type ' +
|
||||
'FROM information_schema.TABLE_CONSTRAINTS tc ' +
|
||||
'JOIN information_schema.KEY_COLUMN_USAGE cu ' +
|
||||
'ON tc.table_schema=cu.table_schema and tc.table_name=cu.table_name ' +
|
||||
'and tc.constraint_name=cu.constraint_name ' +
|
||||
"and tc.constraint_type='PRIMARY KEY') pk " +
|
||||
'ON pk.table_schema=c.table_schema ' +
|
||||
'AND pk.table_name=c.table_name ' +
|
||||
'AND pk.column_name=c.column_name ' +
|
||||
`WHERE c.table_name = ${this.escape(tableName)} AND c.table_schema = ${this.escape(schema)}`
|
||||
);
|
||||
};
|
||||
|
||||
queryGenerator.describeTableQuery = describeTableQuery.bind(queryGenerator);
|
||||
}
|
||||
|
||||
export function patchSequelizeQueryInterface(db: Database) {
|
||||
if (db.inDialect('postgres')) {
|
||||
//@ts-ignore
|
||||
const queryGenerator = db.sequelize.dialect.queryGenerator;
|
||||
|
||||
queryGenerator.showConstraintsQuery = (tableName, constraintName) => {
|
||||
const lines = [
|
||||
'SELECT constraint_catalog AS "constraintCatalog",',
|
||||
'constraint_schema AS "constraintSchema",',
|
||||
'constraint_name AS "constraintName",',
|
||||
'table_catalog AS "tableCatalog",',
|
||||
'table_schema AS "tableSchema",',
|
||||
'table_name AS "tableName",',
|
||||
'constraint_type AS "constraintType",',
|
||||
'is_deferrable AS "isDeferrable",',
|
||||
'initially_deferred AS "initiallyDeferred"',
|
||||
'from INFORMATION_SCHEMA.table_constraints',
|
||||
`WHERE table_name='${tableName}'`,
|
||||
];
|
||||
|
||||
if (!constraintName) {
|
||||
lines.push(`AND constraint_name='${constraintName}'`);
|
||||
}
|
||||
|
||||
if (db.options.schema && db.options.schema !== 'public') {
|
||||
lines.push(`AND table_schema='${db.options.schema}'`);
|
||||
}
|
||||
|
||||
return lines.join(' ');
|
||||
};
|
||||
patchShowConstraintsQuery(queryGenerator, db);
|
||||
patchDescribeTableQuery(queryGenerator);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user