React Native 如何实际设置PRAGMA FOREIGN_KEYS = ON;在展览会上?

j0pj023g  于 2022-12-14  发布在  React
关注(0)|答案(1)|浏览(94)

我真的很想通过在我的一个表定义中使用带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

7hiiyaii

7hiiyaii1#

来自SQLite文档https://www.sqlite.org/foreignkeys.html
缺省情况下禁用外键约束(为了向后兼容),因此必须为每个数据库连接单独启用。(但是,请注意,SQLite的未来版本可能会更改,以便默认启用外键约束。谨慎的开发人员不会对默认是否启用外键做任何假设,而是根据需要启用或禁用外键。)应用程序还可以使用PRAGMA foreign_keys语句来确定当前是否启用了外键。
因此,您可以在任何时候创建到DB的新连接时进行检查。

相关问题