#node.js #migration #entity #typeorm
#node.js #миграция #сущность #typeorm
Вопрос:
Я работаю над своим первым проектом TypeScript, который основан на этом шаблоне: https://github.com/ljlm0402/typescript-express-starter
Я работаю над добавлением миграций в наше приложение, до этого момента мы полагались на функциональность автоматической миграции и удаляли / воссоздавали DB / Tables по мере обновления объектов. Мы хотели бы добавить «пользователя по умолчанию» в нашу систему с помощью миграции… но из-за того, как приложение запускает функции up / down при миграции, по какой-то причине МОЖЕТ создавать / удалять таблицы, но НЕ МОЖЕТ получить доступ ни к одной из этих таблиц для вставки в них данных (?? !!).
Я беспокоюсь, что это может быть .env / ormconfig.js проблема, а также уровень того, как TS компилируется в JS, заставляет меня беспокоиться о том, что по какой-то причине мое приложение не считывает правильный конфигурационный файл.
Как воспроизвести это:
ts-node ./node_modules/typeorm/cli.js --config ./ormconfig.js "migration:run"
ormconfig.js:
const env = process.env.NODE_ENV || 'development';
module.exports = {
type: 'postgres',
host: process.env.POSTGRESQL_HOST,
port: process.env.POSTGRESQL_PORT,
username: process.env.POSTGRESQL_USERNAME,
password: process.env.POSTGRESQL_PASSWORD,
database: process.env.POSTGRESQL_DATABASE,
synchronize: true,
logging: false,
entities: [env === 'production' ? 'build/entity/*{.ts,.js}' : 'src/entity/*{.ts,.js}'],
migrations: [env === 'production' ? 'build/migration/*{.ts,.js}' : 'src/migration/*{.ts,.js}'],
subscribers: [env === 'production' ? 'build/subscriber/*{.ts,.js}' : 'src/subscriber/*{.ts,.js}'],
cli: {
entitiesDir: 'src/entity',
migrationsDir: 'src/migration',
subscribersDir: 'src/subscriber',
},
};
Миграция (обрезана для краткости)
import { MigrationInterface, QueryRunner, TableColumn } from 'typeorm';
import userService from '../services/user.service';
export class SeedDefaultUser1610084649009 implements MigrationInterface {
public userService = new userService();
public async up(queryRunner: QueryRunner): Promise<void> {
const dbs = await queryRunner.getDatabases(); // returns empty array []
const schemas = await queryRunner.getSchemas(); // returns empty array []
console.log(dbs, schemas);
await queryRunner.createTable(
new Table({
name: 'user_entity',
columns: [
{
name: 'id',
type: 'int',
isPrimary: true,
},
{
name: 'email',
type: 'varchar',
},
],
}),
true,
); // Despite no db connections, this works! tables exist!
const user: User = await this.userService.create(
{
email: 'admin@email.com',
},
); // This fails with:
//QueryFailedError: relation "user_entity" does not exist
}
public async down(queryRunner: QueryRunner): Promise<void> {}
}
Ответ №1:
Чтобы вставить поддельные данные с помощью TypeORM, вам нужно создать начальные данные вместо миграции.
Миграции используются для создания таблиц, начальные данные используются для их заполнения данными.
Вы можете следовать этой статье medium, чтобы создать начальное ядро, этот пакет npm или faker.js