我真的很想通过在我的一个表定义中使用带ON DELETE CASCADE的外键约束来简化我的很多逻辑,使用Android原生SQLite和expo-sqlite模块。
通过研究,我发现在每个数据库事务之前必须设置PRAGMA FOREIGN_KEYS = ON。许多其他SQLite库中可用的工具不适用于expo-sqlite。就我所知,我只能使用这个库对每个事务执行一个查询(尽管我希望被证明是错误的)。
因此,目前的简单查询可能如下所示:
export function insertEntity(entity) {
return new Promise((resolve, reject) => {
database.transaction(tx => {
tx.executeSql(
`INSERT INTO ${tableName}
(firstName, lastName)
VALUES (?, ?)`,
[entity.fn, entity.ln],
(_, result) => { resolve(result)},
(_, err) => { reject(err); return true; }
)
})
});
};
但是,当我尝试将PRAGMA FOREIGN_KEYS = ON;
语句设置为该事务的一部分时,如下所示:
export function insertEntity(entity) {
return new Promise((resolve, reject) => {
database.transaction(tx => {
tx.executeSql(
`PRAGMA FOREIGN_KEYS = ON;
INSERT INTO ${tableName}
(firstName, lastName)
VALUES (?, ?)`,
[entity.fn, entity.ln],
(_, result) => { resolve(result)},
(_, err) => { reject(err); return true; }
)
})
});
};
我开始收到有关参数无法Map的错误...
我也没有看到一种方法来配置打开DB的任何设置,这将是理想的我想要的。因为我不能想象为什么我会想创建一个外键约束,然后不使用它的默认,但这是如何设计这个API显然...
确实有这样的方法,但是如果没有关于在什么地方和什么时候使用它的上下文,我就搞不清楚了。(在打开DB时只运行一次它吗?在每个事务之前运行它吗?然后我的事务必须是传递给该方法的回调吗?)https://docs.expo.dev/versions/latest/sdk/sqlite/#executing-statements-outside-of-a-transaction
1条答案
按热度按时间7hiiyaii1#
来自SQLite文档https://www.sqlite.org/foreignkeys.html
缺省情况下禁用外键约束(为了向后兼容),因此必须为每个数据库连接单独启用。(但是,请注意,SQLite的未来版本可能会更改,以便默认启用外键约束。谨慎的开发人员不会对默认是否启用外键做任何假设,而是根据需要启用或禁用外键。)应用程序还可以使用PRAGMA foreign_keys语句来确定当前是否启用了外键。
因此,您可以在任何时候创建到DB的新连接时进行检查。