feat: prepare database method (#1492)
This commit is contained in:
		
							parent
							
								
									fa0951171a
								
							
						
					
					
						commit
						856b6efa77
					
				@ -1,5 +1,36 @@
 | 
				
			|||||||
import { mockDatabase } from '../index';
 | 
					import { mockDatabase } from '../index';
 | 
				
			||||||
import { Database } from '../../database';
 | 
					import { Database } from '../../database';
 | 
				
			||||||
 | 
					import { randomStr } from '@nocobase/test';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					describe('auth', () => {
 | 
				
			||||||
 | 
					  let db: Database;
 | 
				
			||||||
 | 
					  afterEach(async () => {
 | 
				
			||||||
 | 
					    if (db) {
 | 
				
			||||||
 | 
					      await db.close();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  it('should auto create schema on prepare when schema missing', async () => {
 | 
				
			||||||
 | 
					    const schemaName = randomStr();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    db = mockDatabase({
 | 
				
			||||||
 | 
					      schema: schemaName,
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!db.inDialect('postgres')) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const querySchemaExists = async () =>
 | 
				
			||||||
 | 
					      await db.sequelize.query(
 | 
				
			||||||
 | 
					        `SELECT schema_name
 | 
				
			||||||
 | 
					         FROM information_schema.schemata
 | 
				
			||||||
 | 
					         WHERE schema_name = '${schemaName}';`,
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    expect((await querySchemaExists())[0].length).toEqual(0);
 | 
				
			||||||
 | 
					    await db.prepare();
 | 
				
			||||||
 | 
					    expect((await querySchemaExists())[0].length).toEqual(1);
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
describe('postgres schema', () => {
 | 
					describe('postgres schema', () => {
 | 
				
			||||||
  let db: Database;
 | 
					  let db: Database;
 | 
				
			||||||
@ -31,7 +62,9 @@ describe('postgres schema', () => {
 | 
				
			|||||||
    await db.clean({ drop: true });
 | 
					    await db.clean({ drop: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const tableInfo = await db.sequelize.query(
 | 
					    const tableInfo = await db.sequelize.query(
 | 
				
			||||||
      `SELECT * FROM information_schema.tables where table_schema = '${db.options.schema}'`,
 | 
					      `SELECT *
 | 
				
			||||||
 | 
					       FROM information_schema.tables
 | 
				
			||||||
 | 
					       where table_schema = '${db.options.schema}'`,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(tableInfo[0].length).toEqual(0);
 | 
					    expect(tableInfo[0].length).toEqual(0);
 | 
				
			||||||
@ -43,7 +76,9 @@ describe('postgres schema', () => {
 | 
				
			|||||||
    await db.clean({ drop: true });
 | 
					    await db.clean({ drop: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const tableInfo = await db.sequelize.query(
 | 
					    const tableInfo = await db.sequelize.query(
 | 
				
			||||||
      `SELECT * FROM information_schema.tables where table_schema = '${db.options.schema}'`,
 | 
					      `SELECT *
 | 
				
			||||||
 | 
					       FROM information_schema.tables
 | 
				
			||||||
 | 
					       where table_schema = '${db.options.schema}'`,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(tableInfo[0].length).toEqual(0);
 | 
					    expect(tableInfo[0].length).toEqual(0);
 | 
				
			||||||
@ -55,7 +90,9 @@ describe('postgres schema', () => {
 | 
				
			|||||||
    await db.sync();
 | 
					    await db.sync();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const newTableInfo = await db.sequelize.query(
 | 
					    const newTableInfo = await db.sequelize.query(
 | 
				
			||||||
      `SELECT * FROM information_schema.tables where table_schema = '${db.options.schema}'`,
 | 
					      `SELECT *
 | 
				
			||||||
 | 
					       FROM information_schema.tables
 | 
				
			||||||
 | 
					       where table_schema = '${db.options.schema}'`,
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    expect(newTableInfo[0].find((item) => item['table_name'] == collection.model.tableName)).toBeTruthy();
 | 
					    expect(newTableInfo[0].find((item) => item['table_name'] == collection.model.tableName)).toBeTruthy();
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,7 @@ import {
 | 
				
			|||||||
  Sequelize,
 | 
					  Sequelize,
 | 
				
			||||||
  SyncOptions,
 | 
					  SyncOptions,
 | 
				
			||||||
  Transactionable,
 | 
					  Transactionable,
 | 
				
			||||||
  Utils
 | 
					  Utils,
 | 
				
			||||||
} from 'sequelize';
 | 
					} from 'sequelize';
 | 
				
			||||||
import { SequelizeStorage, Umzug } from 'umzug';
 | 
					import { SequelizeStorage, Umzug } from 'umzug';
 | 
				
			||||||
import { Collection, CollectionOptions, RepositoryType } from './collection';
 | 
					import { Collection, CollectionOptions, RepositoryType } from './collection';
 | 
				
			||||||
@ -58,7 +58,7 @@ import {
 | 
				
			|||||||
  SyncListener,
 | 
					  SyncListener,
 | 
				
			||||||
  UpdateListener,
 | 
					  UpdateListener,
 | 
				
			||||||
  UpdateWithAssociationsListener,
 | 
					  UpdateWithAssociationsListener,
 | 
				
			||||||
  ValidateListener
 | 
					  ValidateListener,
 | 
				
			||||||
} from './types';
 | 
					} from './types';
 | 
				
			||||||
import { patchSequelizeQueryInterface, snakeCase } from './utils';
 | 
					import { patchSequelizeQueryInterface, snakeCase } from './utils';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -653,6 +653,12 @@ export class Database extends EventEmitter implements AsyncEmitter {
 | 
				
			|||||||
    return await authenticate();
 | 
					    return await authenticate();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  async prepare() {
 | 
				
			||||||
 | 
					    if (this.inDialect('postgres') && this.options.schema && this.options.schema != 'public') {
 | 
				
			||||||
 | 
					      await this.sequelize.query(`CREATE SCHEMA IF NOT EXISTS "${this.options.schema}"`, null);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  async reconnect() {
 | 
					  async reconnect() {
 | 
				
			||||||
    if (this.isSqliteMemory()) {
 | 
					    if (this.isSqliteMemory()) {
 | 
				
			||||||
      return;
 | 
					      return;
 | 
				
			||||||
 | 
				
			|||||||
@ -377,8 +377,11 @@ export class Application<StateT = DefaultState, ContextT = DefaultContext> exten
 | 
				
			|||||||
      console.log(chalk.red(error.message));
 | 
					      console.log(chalk.red(error.message));
 | 
				
			||||||
      process.exit(1);
 | 
					      process.exit(1);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    await this.dbVersionCheck({ exit: true });
 | 
					    await this.dbVersionCheck({ exit: true });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    await this.db.prepare();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (argv?.[2] !== 'upgrade') {
 | 
					    if (argv?.[2] !== 'upgrade') {
 | 
				
			||||||
      await this.load({
 | 
					      await this.load({
 | 
				
			||||||
        method: argv?.[2],
 | 
					        method: argv?.[2],
 | 
				
			||||||
 | 
				
			|||||||
@ -3,3 +3,8 @@ export * from './mockServer';
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
const pgOnly: () => jest.Describe = () => (process.env.DB_DIALECT == 'postgres' ? describe : describe.skip);
 | 
					const pgOnly: () => jest.Describe = () => (process.env.DB_DIALECT == 'postgres' ? describe : describe.skip);
 | 
				
			||||||
export { pgOnly };
 | 
					export { pgOnly };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export function randomStr() {
 | 
				
			||||||
 | 
					  // create random string
 | 
				
			||||||
 | 
					  return Math.random().toString(36).substring(2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user