Knex.js 忽略了外键约束
Foreign Key Constraint ignored by Knex.js
我正在尝试将 Knex.js 与 express 和 Node.js 结合使用。
我正在为 Knex.js 使用 SQLite3。
目前我遇到的问题是 Knex 使用表正确创建外键,但在插入时只是忽略它们(在外部数据库浏览器中我可以看到外键已设置但我无法添加任何内容使用不存在的外键)。但是我希望我不能用knex插入元组,不满足外键约束。
创建表格的方法如下:
knex.schema.hasTable('User').then(res => {
if (res)
return;
knex.schema.createTable('User', function (table) {
table.increments('id').primary();
table.string('username').notNullable().unique();
}).then(res => {
console.log("Table User Created");
});
});
knex.schema.hasTable('Room').then(res => {
if (res)
return;
knex.schema.createTable('Room', function (table) {
table.increments('id').primary();
table.string('room_name').notNullable().unique();
table.integer('owner_id').unsigned().notNullable();
table.foreign('owner_id').references('User.id');
// table.foreign('owner_id').references('id').inTable('User'); //Not Working too
}).then(res => {
console.log("Table Room Created");
});
});
这里临时添加了测试数据
knex('user').insert({
username: 'f',
mail: 'f@f.de'
}).then(res => {
console.log(res);
});
knex('room').insert({
room_name: 'r',
owner_id: 2 // THIS SHOULD NOT WORK!!!
}).then(res => {
console.log(res);
});
我终于明白了:SQLite 默认禁用外键约束。
添加这个解决了问题
knex.raw("PRAGMA foreign_keys = ON;").then(() => {
console.log("Foreign Key Check activated.");
});
我正在尝试将 Knex.js 与 express 和 Node.js 结合使用。
我正在为 Knex.js 使用 SQLite3。
目前我遇到的问题是 Knex 使用表正确创建外键,但在插入时只是忽略它们(在外部数据库浏览器中我可以看到外键已设置但我无法添加任何内容使用不存在的外键)。但是我希望我不能用knex插入元组,不满足外键约束。
创建表格的方法如下:
knex.schema.hasTable('User').then(res => {
if (res)
return;
knex.schema.createTable('User', function (table) {
table.increments('id').primary();
table.string('username').notNullable().unique();
}).then(res => {
console.log("Table User Created");
});
});
knex.schema.hasTable('Room').then(res => {
if (res)
return;
knex.schema.createTable('Room', function (table) {
table.increments('id').primary();
table.string('room_name').notNullable().unique();
table.integer('owner_id').unsigned().notNullable();
table.foreign('owner_id').references('User.id');
// table.foreign('owner_id').references('id').inTable('User'); //Not Working too
}).then(res => {
console.log("Table Room Created");
});
});
这里临时添加了测试数据
knex('user').insert({
username: 'f',
mail: 'f@f.de'
}).then(res => {
console.log(res);
});
knex('room').insert({
room_name: 'r',
owner_id: 2 // THIS SHOULD NOT WORK!!!
}).then(res => {
console.log(res);
});
我终于明白了:SQLite 默认禁用外键约束。
添加这个解决了问题
knex.raw("PRAGMA foreign_keys = ON;").then(() => {
console.log("Foreign Key Check activated.");
});