我在使用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()
查询方法不起作用吗?
答案 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在应用程序中解决此问题的步骤。
转到您的数据库以确认您的扩展程序可用。
postgres=# SELECT * FROM pg_extension;
验证“ uuid-ossp”已安装在所需的数据库名称中。
database_name=# CREATE EXTENSION "uuid-ossp"
返回您的应用,转到要更改表的KNEX迁移文件。
t.uuid('user_id').defaultTo(knex.raw('uuid_generate_v4()'));
使用KNEX命令使批处理运行:
knex migrate:latest
在表中插入一个新的原始数据,并确认您的UUID已自动生成。
我希望这些步骤会有所帮助。