typeorm «СОЗДАТЬ БАЗУ ДАННЫХ» миграция

#mysql #nestjs #typeorm

#mysql #nestjs #typeorm

Вопрос:

Мне нужно создать базу данных перед подключением и работать с БД. Я использую nest.js typeorm, при условии всех конфигураций. Когда я запускаю свое приложение, оно говорит: «Невозможно подключиться к базе данных. Ошибка: ER_BAD_DB_ERROR: Unknown database 'test'" .

Еще раз: "Test" в моем рабочем столе MySQL нет базы данных => когда я запускаю приложение, я хочу, чтобы приложение само создавало базу данных (не мной вручную)

Возможно ли это?

Ответ №1:

NestJS не может создать базу данных, вам нужно создать ее вручную перед запуском вашего приложения.

Если вы хотите, чтобы это было автоматически, вы можете использовать службу docker для создания своей базы данных при запуске docker compose с docker-compose up

 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>
 

Комментарии:

1. спасибо. Да, я знал об этом подходе. Я думал, что есть какие-то другие способы.

2. Добро пожаловать, это единственный подход, к сожалению, вы не можете использовать NestJS для создания своей базы данных.

Ответ №2:

Я нашел способ добиться этого для postgresql. Также я использую Nest.js и Typeorm тоже. Во-первых, я создал два файла sql (один для проверки наличия базы данных и один для создания базы данных), а затем конфигурационный файл для базы данных. Содержимое этих файлов похоже на приведенное ниже.

  • Проверьте dbifexists.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;
 

Затем я добавил эти строки

  • гнездо-cli.json
     
     "compilerOptions": {
         "assets": ["persistence/script/*"]
       } 
    
     
  • app.module.ts
        @Module({
       imports: [DBConfig()]
       ...