如何为 TypeORM 指定 ormconfig.ts?

Posted

技术标签:

【中文标题】如何为 TypeORM 指定 ormconfig.ts?【英文标题】:How to specify ormconfig.ts for TypeORM? 【发布时间】:2019-02-10 17:29:41 【问题描述】:

我使用默认具有 ormconfig.json 的 TypeORM CLI 创建了一个示例 TypeORM 项目:


   "type": "postgres",
   "host": "localhost",
   "port": 5432,
   "username": "postgres",
   "password": "postgres",
   "database": "test",
   "synchronize": false,
   "entities": [
      "src/entity/**/*.ts"
   ],
   "migrations": [
      "database/migrations/**/*.ts"
   ],
   "subscribers": [
      "src/subscriber/**/*.ts"
   ],
   "cli": 
      "entitiesDir": "src/entity",
      "migrationsDir": "database/migrations",
      "subscribersDir": "src/subscriber"
   

这是目录结构:

-database
  -migrations
-src
  -entity
-ormconfig.json

这会在 database/migrations 文件夹中正确创建迁移,并从中执行迁移。

我将 ormconfig.json 替换为以下 ormconfig.ts :

export default 
    type: 'postgres',
    host: 'localhost',
    port: 5432,
    username: 'postgres',
    password: 'postgres',
    database: 'test',
    synchronize: false,
    "entities": [
        "src/entity/**/*.ts"
    ],
    "migrations": [
         "database/migrations/**/*.ts"
    ],
    "subscribers": [
        "src/subscriber/**/*.ts"
    ],
    "cli": 
        "entitiesDir": "src/entity",
        "migrationsDir": "database/migrations",
        "subscribersDir": "src/subscriber"
    
;

然而,这会在根目录而不是在 database/migrations 中创建迁移。

谁能帮我弄清楚这里缺少什么以及如何使用 ormconfig.ts 在预期目录中生成迁移?

【问题讨论】:

我现在遇到了这个问题。你修好了吗? 【参考方案1】:

嘿,我可以讨论这个话题,因为我可以给你一个解决方案。

您可以在package.json 文件中加入以下行:

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config server/environments/database.ts",

并且您的 ts 配置必须通过这样做直接导出配置:

export =  /* your config */ ;

如您所见,您还可以指定配置的路径。您的配置无需位于项目的根级别。

希望对你有帮助

【讨论】:

【参考方案2】:

在撰写本文时,TypeORM 仅查找 ormconfig.json 而忽略 ormconfig.ts。不过有work in progress 支持。

除了 ormconfig.json 之外,您还需要在 package.json 中使用这些命令。

"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/.bin/typeorm",
"migration:generate": "npm run typeorm -- migration:generate --config src/config/ormconfig.json --connection  --name ",
"migration:run": "npm run typeorm -- migration:run"

【讨论】:

【参考方案3】:

导出时只需删除default。 你的ormconfig.ts 应该是这样的:

import env from './src/env';

export = 
  host: env.DB_CONFIG.host,
  type: 'mysql',
  port: env.DB_CONFIG.port,
  username: env.DB_CONFIG.username,
  password: env.DB_CONFIG.password,
  database: env.DB_CONFIG.database,
  entities: [
    'src/**/**.entity.ts,.js',
  ],
  migrations: [
    'src/database/migrations/*.ts',
  ],
  cli: 
    migrationsDir: 'src/database/migrations',
  ,
  synchronize: false,
;

在我的例子中,我使用了一个主要的env.ts 文件,因为数据库连接需要根据环境而有所不同。 另外,不要忘记在package.json 中使用ts-node 处理typeorm cli

...
"scripts": 
    ...
    "migrate:create": "ts-node ./node_modules/typeorm/cli.js migration:create -n",
    "migrate:up": "ts-node ./node_modules/typeorm/cli.js migration:run",
    "migrate:down": "ts-node ./node_modules/typeorm/cli.js migration:revert"
    ...
  
...

所以创建、运行或回滚迁移应该是这样的:

npm run migrate:create FileName
npm run migrate:up
npm run migrate:down

【讨论】:

由于typeorm 包的bin 已经映射到cli.js,您可以在这些命令中省略cli.js。所以它只是ts-node ./node_modules/typeorm ...【参考方案4】:

项目结构

.
├── src // Typescript files
│   ├── entities
│   │   └── User.ts
│   ├── db
│   │   └── ormconfig.ts
│   │   ├── migrations
│   │   │   └── ... // migration files
├── tsconfig.json
├── package.json

要求

Typeorm 应该可以使用src/db/ormconfig.ts 文件进行连接。 我们应该能够创建migrations,并使用src/db/ormconfig.ts 文件执行所有typeorm cli 支持的操作。

可能性

我们或许可以使用可用于 typescript 的 ts-node 包来完成此操作。

解决方案和 Github 链接

完整示例请查看https://github.com/devjayantmalik/sample-node-typeorm。

src/db/ormconfig.ts 文件的内容是:

import path from "path";
import  ConnectionOptions  from "typeorm";

export default 
  name: "default",
  type: "better-sqlite3",
  database: ":memory:",
  synchronize: true,
  migrationsRun: true,
  dropSchema: false,
  entities: [path.join(__dirname, "..", "entities", "**", "*.*"), path.join(__dirname, "..", "entities", "*.*")],
  migrations: [path.join(__dirname, "migrations", "*.*")],
  cli: 
    entitiesDir: path.join(__dirname, "..", "entities"),
    migrationsDir: path.join(__dirname, "migrations")
  
 as ConnectionOptions;

src/db/package.json 文件的脚本部分是:

"scripts": 
  "dev": "ts-node-dev src/index.ts",
  "build": "tsc",
  "start": "node dist/index.js",
  "typeorm": "ts-node ./node_modules/.bin/typeorm -f ./src/db/ormconfig.ts",
  "migration:generate": "yarn run typeorm migration:generate -n",
  "migration:blank": "yarn run typeorm migration:create -n"
,```

## Usage

```bash
# Generate a blank migration
yarn migration:blank migration-name-here

# Generate migrations from database and entities.
yarn migration:generate

# Roll back a migration using cli options.
yarn typeorm migration:down

【讨论】:

你提供的例子有工作回购吗? 抱歉,我没有公开的。 能否请您添加一个最小的工作示例 repo? 查看解决方案部分的 github 链接。我已经更新了答案以包含 github 链接。【参考方案5】:

解决方案

指定 ormconfig.ts

import  ConnectionOptions  from 'typeorm';

// Check typeORM documentation for more information.
const config: ConnectionOptions = 
    type: 'postgres',
    host: process.env.SQL_IP, // localhost
    port: process.env.SQL_PORT,// 5432
    username: process.env.SQL_USER, // databse login role username
    password: process.env.SQL_PASSWORD, // database login role password
    database: process.env.SQL_DATABASE, // db name

    // entities name should be **.entity.ts
    entities: [__dirname + '/**/*.entity.ts,.js'],

    // We are using migrations, synchronize should be set to false.
    // synchronize: process.env.TYPEORM_SYNCHRONIZE
    //  ? process.env.TYPEORM_SYNCHRONIZE.toLowerCase() === 'true'
    //  : false,
    synchronize: false,

    // Run migrations automatically,
    // you can disable this if you prefer running migration manually.
    migrationsRun: false,

    logging: false,
    // logger: 'advanced-console',

    // Allow both start:prod and start:dev to use migrations
    // __dirname is either dist or src folder, meaning either
    // the compiled js in prod or the ts in dev.
    migrations: [__dirname + '/migrations/*.ts,.js'],
    cli: 
        // Location of migration should be inside src folder
        // to be compiled into dist/ folder.
        migrationsDir: 'src/database/migrations'
    
;

export = config;


在 Package.json 中的脚本下定义这个

"typeorm": "ts-node --files -r tsconfig-paths/register ./node_modules/typeorm/cli.js --config src/database/config.ts"
"db:migrate": "npm run typeorm migration:run",
"db:create-migration": "npm run typeorm migration:create -- -n",

【讨论】:

【参考方案6】:

如果您使用带有 PnP 的 Yarn 2 作为包管理器,那么您不能在此处与其他解决方案完全相同,因为您没有 node_modules 目录。

这是我如何让它工作的方法:

package.json


  "scripts": 
    "typeorm": "yarn node -r ts-node/register/transpile-only $(yarn bin typeorm)",
    "generate-migration": "yarn typeorm --config ormconfig.ts migration:generate --check",
  
  "dependencies": 
     "typeorm": "^0.2.41",
  
  "devDependencies": 
    "ts-node": "^10.4.0",
  

ormconfig.ts

/* eslint-disable no-process-env */
import dotenv from 'dotenv';
import  SnakeNamingStrategy  from 'typeorm-naming-strategies';

dotenv.config();
dotenv.config( path: './.env.local' );

export = 
  type: 'postgres',
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  username: process.env.DB_USERNAME,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  entities: ['src/infrastructure/persistence/**/*.entity.ts'],
  migrations: ['src/infrastructure/persistence/migrations/**/*.ts,js'],
  cli: 
    migrationsDir: 'src/infrastructure/persistence/migrations',
  ,
  namingStrategy: new SnakeNamingStrategy(),
;

【讨论】:

【参考方案7】:

花了一些时间,但这让它对我有用 - build 将 TS 代码编译为 dist 文件和 node 来运行它。 ts-node 不想与我的项目配合得很好,我认为这很干净。 nodemon 用于在 dev 中运行它 - 虽然我认为我需要为那个 / 添加 ts-node 仍然可以编译和运行。

ormconfig.ts

import  ConnectionOptions  from 'typeorm';    
export const baseConfig: ConnectionOptions = 
      synchronize: true, // TODO turn false after initial setup i.e. when moving to migrations
      type: 'mysql',
      host: 'localhost',
      port: 3306,
      username: 'xxx',
      password: 'xxx',
      database: 'xxx',
      entities: ['dist/Entities/**/**.entity.js'],
      migrations: ['dist/Migrations/*.js'],
      cli: 
        entitiesDir: 'dist/Entities/**/*.js',
        migrationsDir: 'dist/Migrations/*.js'
      
    ;

和 package.json 脚本

  "scripts": 
    "build": "rimraf ./dist && tsc",
    "start": "npm run build && node dist/index.js",
    "dev": "nodemon src/index.ts",
    "format:prettier": "prettier --config .prettierrc 'src/**/*.ts' --write",
    "lint": "eslint . --ext .ts",
    "lint:fix": "eslint . --ext .ts --fix",
    "test": "jest --runInBand"
  ,

【讨论】:

以上是关于如何为 TypeORM 指定 ormconfig.ts?的主要内容,如果未能解决你的问题,请参考以下文章

javascript typeORM ormconfig.js

json typeORM ormconfig.json

TypeORM CLI - 如何在特定数据库上运行迁移

Typeorm - 基于实体的迁移

如何为 postgresql MATERIALIZED VIEW 创建 typeorm 实体

Typeorm 连接多个数据库