KnexJS необработанный запрос в миграции - PullRequest
0 голосов
/ 24 октября 2018

У меня проблема со следующей миграцией в KnexJS, работающей с PostgreSQL:

exports.up = (knex) => {
    knex.raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');

    return knex.schema.createTable('car_brands', (table) => {
        table.uuid('brandId').unique().notNullable().primary().defaultTo(knex.raw('uuid_generate_v4()'));
        table.string('name').notNullable().unique();
        table.timestamp('created_at').notNullable().defaultTo(knex.raw('now()'));
        table.timestamp('updated_at').notNullable().defaultTo(knex.raw('now()'));
    });
};

exports.down = (knex) => {
    knex.raw('drop extension if exists "uuid-ossp"');
    return knex.schema.dropTable('car_brands');
};

Я использую тип UUID для значений по умолчанию, используя
defaultTo(knex.raw('uuid_generate_v4()')).

Однако при выполнении вышеуказанной миграции:

knex migrate:latest --env development --knexfile knexfile.js --debug true

я получаю сообщение об ошибке:

function uuid_generate_v4() does not exist

Знаете ли вы, почему метод запроса knex.raw()не работает?

1 Ответ

0 голосов
/ 24 октября 2018

Проблема в том, что вы выполняете

knex.raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');

и

knex.schema.createTable('car_brands');

асинхронно, поэтому первый запрос не выполняется перед вторым.

Перепишите егоиспользуя async/await:

exports.up = async (knex) => {
    await knex.raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');

    return knex.schema.createTable('car_brands', (table) => {
        table.uuid('brandId').unique().notNullable().primary().defaultTo(knex.raw('uuid_generate_v4()'));
        table.string('name').notNullable().unique();
        table.timestamp('created_at').notNullable().defaultTo(knex.raw('now()'));
        table.timestamp('updated_at').notNullable().defaultTo(knex.raw('now()'));
    });
};

или используя Promises:

exports.up = async (knex) => {
    knex.raw('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"')
        .then(() => {
            return knex.schema.createTable('car_brands', (table) => {
                table.uuid('brandId').unique().notNullable().primary().defaultTo(knex.raw('uuid_generate_v4()'));
                table.string('name').notNullable().unique();
                table.timestamp('created_at').notNullable().defaultTo(knex.raw('now()'));
                table.timestamp('updated_at').notNullable().defaultTo(knex.raw('now()'));
            });
        })
};
...