feat: support query interface generateJsonPathExpression

This commit is contained in:
aaaaaajie 2025-04-07 15:29:48 +08:00
parent a71dff4d4b
commit 5be0bb9807
7 changed files with 26 additions and 6 deletions

View File

@ -105,6 +105,7 @@ export interface IDatabaseOptions extends Options {
logger?: LoggerOptions | Logger;
customHooks?: any;
instanceId?: string;
sqlParser?: string;
}
export type DatabaseOptions = IDatabaseOptions;

View File

@ -87,6 +87,7 @@ export async function parseDatabaseOptionsFromEnv(): Promise<IDatabaseOptions> {
tablePrefix: process.env.DB_TABLE_PREFIX,
schema: process.env.DB_SCHEMA,
underscored: process.env.DB_UNDERSCORED === 'true',
sqlParser: process.env.DB_DIALECT === 'mssql' ? 'TransactSQL' : undefined,
};
const sslOptions = await extractSSLOptionsFromEnv();

View File

@ -8,7 +8,7 @@
*/
/* istanbul ignore file -- @preserve */
import { Database, IDatabaseOptions } from '@nocobase/database';
import { Database, IDatabaseOptions, sqlParser } from '@nocobase/database';
import { merge } from '@nocobase/utils';
import { customAlphabet } from 'nanoid';
import fetch from 'node-fetch';
@ -42,6 +42,7 @@ export function getConfigByEnv() {
underscored: process.env.DB_UNDERSCORED === 'true',
schema: process.env.DB_SCHEMA !== 'public' ? process.env.DB_SCHEMA : undefined,
dialectOptions: {},
sqlParser: process.env.DB_DIALECT === 'mssql' ? 'TransactSQL' : undefined,
};
if (process.env.DB_DIALECT == 'postgres') {

View File

@ -166,4 +166,8 @@ export default abstract class QueryInterface {
throw error;
}
}
public generateJsonPathExpression(field: string, path: string) {
return `${field}.${path}`;
}
}

View File

@ -90,7 +90,7 @@ describe('sql collection', () => {
expect(res.body.data.sources).toEqual(['testSqlCollection']);
});
it('sqlCollection:update', async () => {
it.only('sqlCollection:update', async () => {
await agent.resource('collections').create({
values: {
name: 'fakeCollection',

View File

@ -41,6 +41,10 @@ export class SQLModel extends Model {
const schema = process.env.DB_SCHEMA || 'public';
return `${schema}.${table}`;
}
if (this.database.inDialect('mssql') && !table.includes('.')) {
const schema = process.env.DB_SCHEMA || 'dbo';
return `${schema}.${table}`;
}
return table;
}
@ -76,7 +80,7 @@ export class SQLModel extends Model {
table: string;
columns: { name: string; as?: string }[];
}[] {
let { ast: _ast } = sqlParser.parse(this.sql);
let { ast: _ast } = sqlParser.parse(this.sql, { database: this.database.options.sqlParser });
if (Array.isArray(_ast)) {
_ast = _ast[0];
}

View File

@ -1,3 +1,12 @@
/**
* This file is part of the NocoBase (R) project.
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
* Authors: NocoBase Team.
*
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
* For more information, please refer to: https://www.nocobase.com/agreement.
*/
import { Database } from '@nocobase/database';
import { FieldIsDependedOnByOtherError } from '../errors/field-is-depended-on-by-other';
@ -14,12 +23,12 @@ export function beforeDestoryField(db: Database) {
filter: {
$or: [
{
['options.sourceKey']: name,
[db.queryInterface.generateJsonPathExpression('options', 'sourceKey')]: name,
collectionName,
},
{
['options.targetKey']: name,
['options.target']: collectionName,
[db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: name,
[db.queryInterface.generateJsonPathExpression('options', 'targetKey')]: collectionName,
},
],
},