From ec7bc2bc8b59e78c172dfbd638f30034395f7a46 Mon Sep 17 00:00:00 2001 From: chenos Date: Mon, 4 Jul 2022 13:41:07 +0800 Subject: [PATCH] feat(cli): check database version before installation (#572) * feat(cli): check database version before installation * fix: log * fix: fix bugs * fix: postgres * fix: run beforeInstall --- .../installation/create-nocobase-app.md | 2 +- .../getting-started/installation/git-clone.md | 2 +- .../installation/create-nocobase-app.md | 2 +- .../getting-started/installation/git-clone.md | 2 +- packages/core/cli/src/commands/start.js | 6 +++ packages/core/database/package.json | 1 + packages/core/database/src/database.ts | 44 +++++++++++++++++++ packages/core/server/src/application.ts | 11 +++++ 8 files changed, 66 insertions(+), 4 deletions(-) diff --git a/docs/en-US/getting-started/installation/create-nocobase-app.md b/docs/en-US/getting-started/installation/create-nocobase-app.md index 7d805d74e..27fd38d03 100644 --- a/docs/en-US/getting-started/installation/create-nocobase-app.md +++ b/docs/en-US/getting-started/installation/create-nocobase-app.md @@ -76,7 +76,7 @@ yarn dev Production ```bash -yarn start +yarn start # Does not support running on win platform ``` Note: For production, if the code has been modified, you need to execute `yarn build` and restart NocoBase. diff --git a/docs/en-US/getting-started/installation/git-clone.md b/docs/en-US/getting-started/installation/git-clone.md index c5fb8600f..d17ccf793 100644 --- a/docs/en-US/getting-started/installation/git-clone.md +++ b/docs/en-US/getting-started/installation/git-clone.md @@ -56,7 +56,7 @@ Production # Compile yarn build # Start -yarn start +yarn start # Does not support running on win platform ``` ## 7. Log in to NocoBase diff --git a/docs/zh-CN/getting-started/installation/create-nocobase-app.md b/docs/zh-CN/getting-started/installation/create-nocobase-app.md index be605548b..c270ecb2e 100644 --- a/docs/zh-CN/getting-started/installation/create-nocobase-app.md +++ b/docs/zh-CN/getting-started/installation/create-nocobase-app.md @@ -83,7 +83,7 @@ yarn dev 生产环境 ```bash -yarn start +yarn start # 暂不支持在 win 平台下运行 ``` 注:生产环境,如果代码有修改,需要执行 `yarn build`,再重新启动 NocoBase。 diff --git a/docs/zh-CN/getting-started/installation/git-clone.md b/docs/zh-CN/getting-started/installation/git-clone.md index 743e60921..056a1d2db 100644 --- a/docs/zh-CN/getting-started/installation/git-clone.md +++ b/docs/zh-CN/getting-started/installation/git-clone.md @@ -58,7 +58,7 @@ yarn dev # 编译 yarn build # 启动 -yarn start +yarn start # 暂不支持在 win 平台下运行 ``` ## 7. 登录 NocoBase diff --git a/packages/core/cli/src/commands/start.js b/packages/core/cli/src/commands/start.js index ee6976a6a..2e6afc5fb 100644 --- a/packages/core/cli/src/commands/start.js +++ b/packages/core/cli/src/commands/start.js @@ -19,6 +19,12 @@ module.exports = (cli) => { if (opts.port) { process.env.APP_PORT = opts.port; } + if (process.platform === 'win32') { + console.log( + chalk.yellow(`It is not supported on win platform, please use \`${chalk.green('yarn dev')}\` instead`), + ); + return; + } if (process.argv.includes('-h') || process.argv.includes('--help')) { promptForTs(); run('ts-node', [ diff --git a/packages/core/database/package.json b/packages/core/database/package.json index 3c1b161e1..811b4cd29 100644 --- a/packages/core/database/package.json +++ b/packages/core/database/package.json @@ -18,6 +18,7 @@ "flat": "^5.0.2", "glob": "^7.1.6", "mathjs": "^10.6.1", + "semver": "^7.3.7", "sequelize": "^6.9.0", "umzug": "^3.1.1" }, diff --git a/packages/core/database/src/database.ts b/packages/core/database/src/database.ts index 3495cc344..f55210ef1 100644 --- a/packages/core/database/src/database.ts +++ b/packages/core/database/src/database.ts @@ -4,6 +4,7 @@ import { EventEmitter } from 'events'; import glob from 'glob'; import lodash from 'lodash'; import { basename, isAbsolute, resolve } from 'path'; +import semver from 'semver'; import { ModelCtor, Op, @@ -65,6 +66,46 @@ export type AddMigrationsOptions = { type OperatorFunc = (value: any, ctx?: RegisterOperatorsContext) => any; +class DatabaseVersion { + db: Database; + + constructor(db: Database) { + this.db = db; + } + + async satisfies(versions) { + const dialects = { + sqlite: { + sql: 'select sqlite_version() as version', + get: (v) => v, + }, + mysql: { + sql: 'select version() as version', + get: (v) => v, + }, + postgres: { + sql: 'select version() as version', + get: (v) => { + const keys = v.split(' '); + keys.shift(); + return semver.minVersion(keys.shift()).version; + }, + }, + }; + for (const dialect of Object.keys(dialects)) { + if (this.db.inDialect(dialect)) { + if (!versions?.[dialect]) { + return false; + } + const [result] = (await this.db.sequelize.query(dialects[dialect].sql)) as any; + console.log(`db version: ${dialects[dialect].get(result?.[0]?.version)}`); + return semver.satisfies(dialects[dialect].get(result?.[0]?.version), versions[dialect]); + } + } + return false; + } +} + export class Database extends EventEmitter implements AsyncEmitter { sequelize: Sequelize; migrator: Umzug; @@ -79,12 +120,15 @@ export class Database extends EventEmitter implements AsyncEmitter { modelCollection = new Map, Collection>(); modelHook: ModelHook; + version: DatabaseVersion; delayCollectionExtend = new Map(); constructor(options: DatabaseOptions) { super(); + this.version = new DatabaseVersion(this); + const opts = { sync: { alter: { diff --git a/packages/core/server/src/application.ts b/packages/core/server/src/application.ts index 8c4fcfa6c..381620321 100644 --- a/packages/core/server/src/application.ts +++ b/packages/core/server/src/application.ts @@ -323,6 +323,17 @@ export class Application exten async install(options: InstallOptions = {}) { await this.emitAsync('beforeInstall', this, options); + const r = await this.db.version.satisfies({ + mysql: '8.x', + sqlite: '3.x', + postgres: '>=10', + }); + + if (!r) { + console.log('The database only supports MySQL 8.x, SQLite 3.x and PostgreSQL 10+'); + return; + } + if (options?.clean) { await this.db.clean(isBoolean(options.clean) ? { drop: options.clean } : options.clean); }