javascript - 没有从 NodeJS / JavaScript 触发 SQLite FOREIGN KEY 约束
问题描述
我正在尝试创建一个 POST 路由,如下所示。我的 Timesheet 表有一个 FOREIGN KEY 约束集,它引用了 Employee 表。当我尝试使用 DB Browser 插入不存在的员工的时间表时,我得到了由约束触发的正确错误。但是,当我运行下面的代码时,它会忽略此约束并插入记录。我是否设置不正确,或者在这种情况下这不是有效的约束?
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});
});
}
});
});
建表代码:
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);
}
});
});
注意:getParams 是一个确定 empID 值的函数。
解决方案
目前,在 SQLite 版本 3.25.2中,默认情况下禁用外键约束。您需要通过以下方式打开它们
sqlite> PRAGMA foreign_keys = ON;
或者,在你的情况下
db.get("PRAGMA foreign_keys = ON")
我假设。
它在每个连接的基础上工作,DB Browser 可能会在启动时自动设置它,这就是它在这种情况下触发错误的原因。
推荐阅读
- firebase - FlutterFire - 在哪里获取验证码 # 通过 FirebaseAuth 上的电子邮件
- python - 使用 Python 通过流将数据从 S3 传输到 FTP 服务器
- flutter - Flutter sms_autofill 并不总是自动读取 OTP
- node.js - 是否可以在 Cloud Task 中从 Google Cloud Storage 安排 maven jar 文件?
- angular - 在 iis 上发布 Angular 应用程序 - 仅在 iis 端出错
- typescript - 将新值更新到现有接口打字稿
- sql - 为什么 Last_value 需要 frame_clause 才能获得像 First_Value - Window Function PostgreSQL 这样的结果
- reactjs - 使用 React Hooks 更新状态数组对象的最佳方法?
- elasticsearch - Elasticsearch - 使用 n-gram 搜索通配符
- c# - 如何真正使用 HttpRequestMessage 并避免 HttpClient PostAsync 中的错误 500?