typeorm synchronize= true not working

来源:8-6 使用TypeOrm创建多个实体&创建1对1关系

小狗会飞

2023-05-19

问题 :
typeorm 设置 synchronize= true 但 npm run start:dev 启动项目 数据库并没有对应entity的数据表

启动时候 typeorm的日志:

config {
  DB_TYPE: 'mysql',
  DB_HOST: '127.0.0.1',
  DB_PORT: '3307',
  DB_USERNAME: 'root',
  DB_DATABASE: 'testdb',
  DB_PASSWORD: 'example',
  DB_SYNC: 'true',
  LOG_ON: 'false',
  LOG_LEVEL: 'info',
  TIMESTAMP: 'true',
  APP_PORT: '3000',
  REDIS_HOST: 'localhost',
  REDIS_PORT: '6379',
  REDIS_PASSWORD: '',
  REDIS_RECONNECT: 'true',
  SECRET: 'mHgGuoJYOuiXILqnXyqKQ1joRQ6YhoPBb6CUfVp6qi1BBK2rtQNjsgaxRxRAsOii'
}
[Nest] 93280  - 2023/05/19 上午8:39:51     LOG [NestFactory] Starting Nest application...
[Nest] 93280  - 2023/05/19 上午8:39:52     LOG [InstanceLoader] RedisModule dependencies initialized +144ms
[Nest] 93280  - 2023/05/19 上午8:39:52     LOG [InstanceLoader] TypeOrmModule dependencies initialized +5ms

ormconfig.ts

import { TypeOrmModuleOptions } from '@nestjs/typeorm';

import { DataSource, DataSourceOptions } from 'typeorm';
import * as fs from 'fs';
import * as dotenv from 'dotenv';
import { ConfigEnum } from './src/enum/config.enum';

// 通过环境变量读取不同的.env文件
export function getEnv(env: string): Record<string, unknown> {
  if (fs.existsSync(env)) {
    return dotenv.parse(fs.readFileSync(env));
  }
  return {};
}

export function getServerConfig() {
  const defaultConfig = getEnv('.env');
  const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`);
  // configService
  const config = { ...defaultConfig, ...envConfig };
  return config;
}

// 通过dotENV来解析不同的配置
export function buildConnectionOptions() {
  const defaultConfig = getEnv('.env');
  const envConfig = getEnv(`.env.${process.env.NODE_ENV || 'development'}`);
  // configService
  const config = { ...defaultConfig, ...envConfig };

  const logFlag = config['LOG_ON'] === 'true';

  const entitiesDir =
    process.env.NODE_ENV === 'development'
      ? [__dirname + '/**/*.entity.ts']
      : [__dirname + '/**/*.entity{.js,.ts}'];
  console.log('config', config)

  return {
    type: config[ConfigEnum.DB_TYPE],
    host: config[ConfigEnum.DB_HOST],
    port: config[ConfigEnum.DB_PORT],
    username: config[ConfigEnum.DB_USERNAME],
    password: config[ConfigEnum.DB_PASSWORD],
    database: config[ConfigEnum.DB_DATABASE],
    entities: entitiesDir,
    // 同步本地的schema与数据库 -> 初始化的时候去使用
    synchronize: true,
    logging: logFlag && process.env.NODE_ENV === 'development',
    // logging: false,
  } as TypeOrmModuleOptions;
}

export const connectionParams = buildConnectionOptions();

export default new DataSource({
  ...connectionParams,
  migrations: ['./dist/src/migrations/**'],
  subscribers: [],
} as DataSourceOptions);

docker-compose.yml

 db:
    image: mysql
    # NOTE: use of "mysql_native_password" is not recommended: https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password
    # (this is just an example, not intended to be a production configuration)
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: testdb
      # MYSQL_USER MYSQL_PASSWORD
    ports:
      - 3307:3306

typeorm 相关包的版本:

 "@nestjs/typeorm": "^9.0.1",
  "typeorm": "0.3.12",

ps: 能通过 npm run migration:run导入数据

data里面没表格,npm run start:dev重启也没有:
图片描述

写回答

1回答

Brian

2023-05-19

尝试删除数据库中的表格,再次启动调试进程没有?


0
2
Brian
回复
小狗会飞
你有没有使用typeorm的模块? 找到AppModule在里面使用它: TypeOrmModule.forRoot(connectionParams)
2023-05-22
共2条回复

NestJS 入门到实战 前端必学服务端新趋势

近几年快速发展的Node.js框架,掌握未来前端工程师后端开发能力

569 学习 · 238 问题

查看课程