【发布时间】:2021-04-29 08:41:41
【问题描述】:
我需要在连接之前创建数据库并使用 db。我使用的是nest.js typeorm,提供了所有配置。当我启动我的应用程序时,它说
"无法连接数据库。错误:ER_BAD_DB_ERROR: Unknown database 'test'"。
再一次:当我启动应用程序时,我的 MySQL Workbench 中没有 DB "Test" =>
我希望应用程序自己创建数据库(而不是由我手动创建)
有可能吗?
【问题讨论】:
我需要在连接之前创建数据库并使用 db。我使用的是nest.js typeorm,提供了所有配置。当我启动我的应用程序时,它说
"无法连接数据库。错误:ER_BAD_DB_ERROR: Unknown database 'test'"。
再一次:当我启动应用程序时,我的 MySQL Workbench 中没有 DB "Test" =>
我希望应用程序自己创建数据库(而不是由我手动创建)
有可能吗?
【问题讨论】:
NestJS 无法创建数据库,需要在启动应用程序之前手动创建。
如果您希望它是自动的,您可以在使用 docker-compose up 启动 docker compose 时使用 docker 服务来创建您的数据库
version: "3.6"
services:
db:
image: mysql:8.0.20
command: --default-authentication-plugin=mysql_native_password
restart: always
ports:
- 3306:3306
environment:
- MYSQL_DATABASE=<database-name>
- MYSQL_ROOT_PASSWORD=<password>
【讨论】:
我找到了一种为 postgresql 实现这一目标的方法。我也在使用 Nest.js 和 Typeorm。首先,我创建了两个 sql 文件(一个用于检查数据库是否存在,一个用于创建 db),然后创建一个数据库配置文件。这些文件内容如下。
checkDbIfExists.sql
SELECT 1 FROM pg_database WHERE datname = 'test'createDB.sql
CREATE DATABASE testconfig.ts
import { DynamicModule } from '@nestjs/common';
import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm';
import { createConnection, getManager } from 'typeorm';
import { PostgresConnectionOptions } from 'typeorm/driver/postgres/PostgresConnectionOptions';
import * as path from 'path';
const fs = require('fs');
const checkDBScript: string = fs
.readFileSync(path.join(__dirname, '../script/checkDBIfExists.sql'))
.toString();
const createDb: string = fs.readFileSync(path.join(__dirname, '../script/createDB.sql')).toString();
const CreateDBIfNotExists = async (options: TypeOrmModuleOptions): Promise<void> => {
const connection = await createConnection(options as PostgresConnectionOptions);
const manager = getManager();
const result = await manager.query(checkDBScript);
if (result.length === 0) await manager.query(createDb);
connection.close();
};
const DBConfig = async (): Promise<DynamicModule> => {
let options: TypeOrmModuleOptions = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'asd',
entities: [],
synchronize: true,
cli: {
migrationsDir: 'persistence/migrations'
}
};
await CreateDBIfNotExists(options);
options = { ...options, database: 'test' };
return TypeOrmModule.forRoot(options);
};
export default DBConfig;
然后我添加了这些行
nest-cli.json
"compilerOptions": {
"assets": ["persistence/script/*"]
}
app.module.ts
@Module({
imports: [DBConfig()]
...
【讨论】: