迁移中的KnexJS原始查询

时间:2018-10-24 12:32:35

标签: sql node.js postgresql knex.js

我在使用PostgreSQL的KnexJS中进行以下迁移时遇到问题:

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()查询方法不起作用吗?

2 个答案:

答案 0 :(得分:2)

问题在于您正在跑步

$: date --version
date (GNU coreutils) 8.26

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

答案 1 :(得分:1)

这些是我使用PostgreSQL,Objection和KNEX在应用程序中解决此问题的步骤。

  1. 转到您的数据库以确认您的扩展程序可用。

    postgres=# SELECT * FROM pg_extension;
    
  2. 验证“ uuid-ossp”已安装在所需的数据库名称中。

    database_name=# CREATE EXTENSION "uuid-ossp"
    
  3. 返回您的应用,转到要更改表的KNEX迁移文件。

    t.uuid('user_id').defaultTo(knex.raw('uuid_generate_v4()'));
    
  4. 使用KNEX命令使批处理运行:

    knex migrate:latest
    
  5. 在表中插入一个新的原始数据,并确认您的UUID已自动生成。

我希望这些步骤会有所帮助。