From 756a3de217eb9a50fba90cdb9eafadfc327817c6 Mon Sep 17 00:00:00 2001 From: ajie Date: Fri, 29 Aug 2025 00:22:11 +0800 Subject: [PATCH] refactor: adjust schema for fetching view list from main data source (#7454) --- .../src/__tests__/view/list-view.test.ts | 19 +++++++++++++++++++ .../postgres-query-interface.ts | 4 ++-- .../src/query-interface/query-interface.ts | 2 +- .../src/server/resourcers/views.ts | 4 +++- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/packages/core/database/src/__tests__/view/list-view.test.ts b/packages/core/database/src/__tests__/view/list-view.test.ts index 90ff53476a7..825bdd30826 100644 --- a/packages/core/database/src/__tests__/view/list-view.test.ts +++ b/packages/core/database/src/__tests__/view/list-view.test.ts @@ -48,4 +48,23 @@ describe('list view', () => { expect(results.find((item) => item.name === 'test1')).toBeTruthy(); expect(results.find((item) => item.name === 'test2')).toBeTruthy(); }); + + it('should list view when schema passed', async () => { + if (!db.options.schema) { + return; + } + + if (db.inDialect('postgres')) { + await db.prepare(); + } + + const viewName = 'schema_test'; + const schema = db.options.schema || process.env.USER_SCHEMA || process.env.DB_COLLECTION_MANAGER_SCHEMA || 'public'; + const newViewName = schema ? `${schema}.${viewName}` : viewName; + await db.sequelize.query(`DROP VIEW IF EXISTS ${newViewName}`); + await db.sequelize.query(`CREATE VIEW ${newViewName} AS SELECT 3`); + + const results = await db.queryInterface.listViews({ schema: db.options.schema }); + expect(results.find((item) => item.name === viewName)).toBeTruthy(); + }); }); diff --git a/packages/core/database/src/query-interface/postgres-query-interface.ts b/packages/core/database/src/query-interface/postgres-query-interface.ts index 1e3abf0a5a0..87c2930c739 100644 --- a/packages/core/database/src/query-interface/postgres-query-interface.ts +++ b/packages/core/database/src/query-interface/postgres-query-interface.ts @@ -107,8 +107,8 @@ export default class PostgresQueryInterface extends QueryInterface { return results[0]['exists']; } - async listViews() { - const targetSchema = this.db.options?.schema || 'public'; + async listViews(options?: { schema?: string }) { + const targetSchema = options?.schema || this.db.options?.schema || 'public'; const sql = targetSchema ? ` diff --git a/packages/core/database/src/query-interface/query-interface.ts b/packages/core/database/src/query-interface/query-interface.ts index 9d8ffe349a5..f9be754c3a6 100644 --- a/packages/core/database/src/query-interface/query-interface.ts +++ b/packages/core/database/src/query-interface/query-interface.ts @@ -25,7 +25,7 @@ export default abstract class QueryInterface { abstract collectionTableExists(collection: Collection, options?: Transactionable): Promise; - abstract listViews(); + abstract listViews(options?: { schema?: string }); abstract viewDef(viewName: string): Promise; diff --git a/packages/plugins/@nocobase/plugin-data-source-main/src/server/resourcers/views.ts b/packages/plugins/@nocobase/plugin-data-source-main/src/server/resourcers/views.ts index f7247b0d390..8c791ae587d 100644 --- a/packages/plugins/@nocobase/plugin-data-source-main/src/server/resourcers/views.ts +++ b/packages/plugins/@nocobase/plugin-data-source-main/src/server/resourcers/views.ts @@ -52,7 +52,9 @@ export default { list: async function (ctx, next) { const db = ctx.app.db as Database; - const dbViews = await db.queryInterface.listViews(); + const dbViews = await db.queryInterface.listViews({ + schema: db.options?.schema || process.env.DB_SCHEMA || process.env.COLLECTION_MANAGER_SCHEMA || 'public', + }); const viewCollections = Array.from(db.collections.values()).filter((collection) => collection.isView());