nat*_*njw 2 javascript sqlite foreign-keys node.js
我正在尝试创建一个POST路由,如下所示。我的时间表表上有一个Employee表,上面设置了FOREIGN KEY约束。当我尝试使用数据库浏览器从一个不存在的员工那里插入时间表时,我得到了由约束触发的正确错误。但是,当我运行下面的代码时,它会忽略此约束并插入记录。我是否对此设置不正确,或者在这种情况下这不是有效的约束?
timesheetRouter.post("/", getParams, (req, res, next) => {
const tsData = req.body.timesheet;
console.log("ID", req.empID);
db.run(`insert into Timesheet (hours, rate, date, employee_id)
values ($hours, $rate, $date, $emp);`, {
$hours: tsData.hours,
$rate: tsData.rate,
$date: tsData.date,
$emp: req.empID
}, function(err) {
if (err) {
return res.status(404).send(err);
} else {
db.get("select * from Timesheet where id = $id", {$id: this.lastID},
(err, row) => {
return res.status(201).send({timesheet: row});
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
表创建代码:
db.serialize(() => {
db.run("DROP TABLE IF EXISTS Timesheet", err => {
if (err) {
throw new Error(err);
}
});
db.run(`create table Timesheet (id integer PRIMARY KEY,
hours integer NOT NULL,
rate integer NOT NULL,
date integer NOT NULL,
employee_id integer NOT NULL, FOREIGN KEY (employee_id) REFERENCES Employee (id))`,
err => {
if (err) {
throw new Error(err);
}
});
});
Run Code Online (Sandbox Code Playgroud)
注意:getParams是确定empID值的函数。
当前,在SQLite 3.25.2版中,默认情况下禁用外键约束。您需要通过以下方式打开它们
sqlite> PRAGMA foreign_keys = ON;
Run Code Online (Sandbox Code Playgroud)
或者,就您而言
db.get("PRAGMA foreign_keys = ON")
Run Code Online (Sandbox Code Playgroud)
我假设。
它基于每个连接工作,DB Browser可能会在启动时自动设置它,这就是在这种情况下它触发错误的原因。
| 归档时间: |
|
| 查看次数: |
411 次 |
| 最近记录: |