J'essaie d'accomplir une migration simple - renommer une colonne dans la table des utilisateurs. Je ne peux pas faire en sorte que le cli utilise le migrationsDir pour créer OU exécuter des migrations à partir de.
CRÉATION DE MIGRATION
Lorsque npm run typeorm:cli -- migration:create -n UserFullName -d 'server/migration
, il n'y a aucun problème à créer le fichier dans le dossier migrations.
La création de migrations sans l'argument -d crée simplement les fichiers à la racine du dossier, elle ignore le migrationsDir dans les options de connexion (voir ormconfig.ts ci-dessous).
MIGRATIONS EN COURS
Exécuter npm run typeorm:cli -- migration:run
donne le statut de sortie 1, je suppose qu'il ne peut pas trouver les migrations, mais je ne sais vraiment pas.
âââ docker-compose.yaml âââ package.json âââ src âââ server â âââ ormconfig.ts â âââ server.ts â âââ app.ts â âââ users â â âââ users.controller.ts â â âââ users.dto.ts â â âââ users.entity.ts â âââ migration
package.json
import { MigrationInterface, QueryRunner } from "typeorm"; export class UserFullName1574403715918 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<any> { await queryRunner.query(`ALTER TABLE "user" RENAME "fullName" to "name"`); } public async down(queryRunner: QueryRunner): Promise<any> { await queryRunner.query(`ALTER TABLE "user" RENAME "name" to "fullName"`); } }
server.ts
import { ConnectionOptions } from 'typeorm'; const config: ConnectionOptions = { type: 'postgres', host: process.env.POSTGRES_HOST, port: Number(process.env.POSTGRES_PORT), username: process.env.POSTGRES_USER, password: process.env.POSTGRES_PASSWORD, database: process.env.POSTGRES_DB, entities: [ __dirname + '/../**/*.entity{.ts,.js}', ], cli: { migrationsDir: 'server', } } export = config;
apps.ts
import * as bodyParser from 'body-parser'; import * as express from 'express'; import Controller from './interfaces/interface.controller'; import errorMiddleware from './middleware/error.middleware'; class App { public app: express.Application; constructor(controllers: Controller[]) { this.app = express(); this.initializeMiddlewares(); this.initializeErrorHandling(); this.initializeControllers(controllers); } public listen() { this.app.listen(process.env.PORT, () => { console.log(`App listening on the port ${process.env.PORT}`); }); } private initializeMiddlewares() { this.app.use(bodyParser.json()); } private initializeErrorHandling() { this.app.use(errorMiddleware); } private initializeControllers(controllers: Controller[]) { controllers.forEach((controller) => { this.app.use('/', controller.router); }); } } export default App;
ormconfig.ts
require('dotenv').config(); import { } from 'reflect-metadata'; import { createConnection } from 'typeorm'; import App from './app'; import * as config from './ormconfig'; import RankingsController from './rankings/rankings.controller'; import RankChartsController from './rankCharts/rankCharts.controller'; import TournamentsController from './tournaments/tournaments.controller'; import UsersController from './users/users.controller'; import validateEnv from './utils/validateEnv'; import WrestlersController from './wrestlers/wrestlers.controller'; validateEnv(); (async () => { try { await createConnection(config); } catch (error) { console.log('Error while connecting to the database', error); return error; } const app = new App( [ new TournamentsController(), new WrestlersController(), new RankingsController(), new RankChartsController(), new UsersController(), ], ); app.listen(); })();
(horodatage) -UserFullName.ts
{ "name": "xxxxxxxxx", "version": "0.1.0", "private": true, "main": "./server/server.ts", "dependencies": { "axios": "^0.19.0", "bcrypt": "^3.0.6", "body-parser": "^1.18.3", "breakpoint-sass": "^2.7.1", "chroma-js": "^2.0.3", "class-transformer": "^0.2.0", "class-validator": "^0.9.1", "dotenv": "^6.2.0", "envalid": "^4.1.4", "express": "^4.16.4", "express-session": "^1.16.1", "http-server": "^0.11.1", "lodash": "^4.17.15", "lodash.isequal": "^4.5.0", "massive": "^5.7.7", "node-sass": "^4.11.0", "pg": "^7.11.0", "react": "^16.8.6", "react-dom": "^16.8.6", "react-router-dom": "^5.0.0", "react-scripts": "2.1.8", "reflect-metadata": "^0.1.13", "sumo-rank": "^1.0.2", "tsconfig-paths": "^3.9.0", "typeorm": "^0.2.18" }, "devDependencies": { "@types/express": "^4.16.1", "@types/node": "^10.12.11", "husky": "^1.2.0", "nodemon": "^1.18.7", "ts-node": "^7.0.1", "tslint": "^5.11.0", "tslint-config-airbnb": "^5.11.1", "typescript": "^3.2.1" }, "scripts": { "dev": "ts-node ./server/server.ts", "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject", "start-sw": "express ./build", "lint": "tslint -p tsconfig.json -c tslint.json", "typeorm:cli": "ts-node ./node_modules/typeorm/cli.js" }, "eslintConfig": { "extends": "react-app" }, "husky": { "hooks": { "pre-commit": "npm run lint" } }, "browserslist": [ ">0.2%", "not dead", "not ie <= 11", "not op_mini all" ] }
Je soupçonne que ma structure de fichier peut être liée au problème, je l'ai donc énumérée brièvement. Je viens d'énumérer quelques notions de base, il y a plus de contrôleurs et d'entités pour les tournois, les lutteurs, les classements, les classements.
Error during migration run: Error: No connection options were found in any of configurations file. at ConnectionOptionsReader.<anonymous> (/Users/matthewshields/Documents/Code/Projects/Sumo/dohyo-dreams/src/connection/ConnectionOptionsReader.ts:41:19) at step (/Users/matthewshields/Documents/Code/Projects/Sumo/dohyo-dreams/node_modules/tslib/tslib.js:133:27) at Object.next (/Users/matthewshields/Documents/Code/Projects/Sumo/dohyo-dreams/node_modules/tslib/tslib.js:114:57) at fulfilled (/Users/matthewshields/Documents/Code/Projects/Sumo/dohyo-dreams/node_modules/tslib/tslib.js:104:62) at process._tickCallback (internal/process/next_tick.js:68:7) at Function.Module.runMain (internal/modules/cjs/loader.js:745:11) at Object.<anonymous> (/Users/matthewshields/Documents/Code/Projects/Sumo/dohyo-dreams/node_modules/ts-node/src/bin.ts:157:12) at Module._compile (internal/modules/cjs/loader.js:689:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10) at Module.load (internal/modules/cjs/loader.js:599:32)
Première affiche, toute critique constructive sur mon format ou mon explication est appréciée.
4 Réponses :
Avez-vous atteint le bon chemin du fichier de migration?
{ cli: { migrationsDir: "src/migration" } }
https://github.com/typeorm/typeorm/blob/master/docs/using-cli.md
s'il s'agit d'une réponse, veuillez ajouter des détails et des explications supplémentaires. Et si cela était destiné à être une nouvelle question, utilisez le bouton approprié pour créer une nouvelle question sans vieille question.
Je pense que le problème est ici parce que vous utilisez une connexion asynchrone. J'ai eu le même problème et j'ai réussi à le résoudre après avoir ajouté le ormconfig.ts
(devrait également fonctionner avec .js
) avec la connexion synchrone.
Dans le fichier de configuration, vous devez ajouter la propriété cli: {migrationsDir: "server/migration"}
Pour pouvoir exécuter des migrations en utilisant cli une autre propriété est nécessaire: migrations: [join(__dirname, 'server/migration/*{.ts,.js}')],
De plus, lors de l'exécution de cli, vous devez indiquer où se trouve ce fichier de configuration --config path/to/ormconfig.ts
flag.
L'exemple de commande complet avec ts: ts-node ./node_modules/typeorm/cli.js migration:generate --config server/ormconfig.ts
Pour plus d'informations, vous pouvez consulter cet exemple https://github.com/ambroiseRabier/typeorm-nestjs-migration-example Je l'ai trouvé très utile.
Comme il semble par votre structure de fichier, la configuration devrait ressembler à ceci:
ormconfig.ts
export const config: TypeOrmModuleOptions = { ... migrations: ['server/migration/*.js', 'server/migration/*.ts'], cli: { migrationsDir: 'server/migration', }, };
Vous devrez peut-être extraire le fichier ormconfig.ts
dossier du server
pour qu'il se trouve au même niveau que package.json
.
Pour tous ceux qui rencontrent des problèmes similaires, ce sont de bonnes pépites que j'ai appréciées:
La CLI typeorm lit le cli.migrationsDir
(à partir de ormconfig.ts) uniquement lors de la création de migrations (pas de lecture). Vous pouvez voir cette distinction subtile ici dans la documentation - elle se lit comme suit:
" ...
"cli": { "migrationsDir": "migration" }
- indique que la CLI doit créer de nouvelles migrations dans le répertoire" migration ". "
C'était déroutant - pourquoi aurait-il besoin d'une configuration séparée juste pour écrire? Les migrations de lecture / écriture ne seraient-elles pas la même configuration? Je ne sais pas, je ne sais toujours pas - mais je l'ai confirmé en lisant également la source (à moins que je ne siffle quelque chose).
Conclusion finale: il est probable que ces configurations ( migrations: [...]
& cli.migrationsDir
) devraient pointer vers le même emplacement sur le système de fichiers à moins que vous n'ayez une bonne raison de ne pas le faire.
À votre santé.