【问题标题】:typeorm "CREATE DATABASE" migrationtypeorm“创建数据库”迁移
【发布时间】:2021-04-29 08:41:41
【问题描述】:

我需要在连接之前创建数据库并使用 db。我使用的是nest.js typeorm,提供了所有配置。当我启动我的应用程序时,它说 "无法连接数据库。错误:ER_BAD_DB_ERROR: Unknown database 'test'"

再一次:当我启动应用程序时,我的 MySQL Workbench 中没有 DB "Test" => 我希望应用程序自己创建数据库(而不是由我手动创建)

有可能吗?

【问题讨论】:

    标签: mysql nestjs typeorm


    【解决方案1】:

    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>
    

    【讨论】:

    • 谢谢。是的,我知道这种方法。我认为还有其他方法。
    • 不客气,这是唯一一种方法,很遗憾,您不能使用 NestJS 创建数据库。
    【解决方案2】:

    我找到了一种为 postgresql 实现这一目标的方法。我也在使用 Nest.js 和 Typeorm。首先,我创建了两个 sql 文件(一个用于检查数据库是否存在,一个用于创建 db),然后创建一个数据库配置文件。这些文件内容如下。

    • checkDbIfExists.sql

      • SELECT 1 FROM pg_database WHERE datname = 'test'
    • createDB.sql

      • CREATE DATABASE test
    • config.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()]
         ...
      
      

    【讨论】:

      猜你喜欢
      • 2021-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2021-08-02
      • 1970-01-01
      • 2018-09-16
      • 2016-10-27
      • 1970-01-01
      相关资源
      最近更新 更多