Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 更新记录及其与sequelize的关联_Sqlite_Associations_Sequelize.js - Fatal编程技术网

Sqlite 更新记录及其与sequelize的关联

Sqlite 更新记录及其与sequelize的关联,sqlite,associations,sequelize.js,Sqlite,Associations,Sequelize.js,我在sequelize中定义了以下模型: 库、媒体父目录、媒体子目录和媒体子目录 前三个保存关于系统上目录的信息,最后一个保存关于系统上特定目录中文件的信息 这些协会如下: Library.MediaParentDirs = Library.hasMany(models.MediaParentDir, {onDelete: 'CASCADE'}); Library.MediaSubDirs = Library.hasMany(models.MediaSubDir, {onDelete: 'CAS

我在sequelize中定义了以下模型:

媒体父目录媒体子目录媒体子目录

前三个保存关于系统上目录的信息,最后一个保存关于系统上特定目录中文件的信息

这些协会如下:

Library.MediaParentDirs = Library.hasMany(models.MediaParentDir, {onDelete: 'CASCADE'});
Library.MediaSubDirs = Library.hasMany(models.MediaSubDir, {onDelete: 'CASCADE'});

MediaParentDir.MediaSubDirs = MediaParentDir.hasMany(models.MediaSubDir, {onDelete: 'CASCADE'});

MediaSubDir.Episodes = MediaSubDir.hasMany(models.Episode, {onDelete: 'CASCADE'});
这是我第一次运行时填充数据库的方式:

db.Library.find({
    where: lib
}).then((existingLib) => {

    let includes = [{
            model: db.MediaParentDir,
            include: [{
                model: db.MediaSubDir,
                include: [db.Episode]
            }]
        },
        {
            model: db.MediaSubDir,
            include: [db.Episode]
        }
    ];

    let mediaParentDirs = removeIgnored(library.getMediaParentDirsFrom(lib))
        .map((parentDir) => {
            parentDir.MediaSubDirs = removeIgnored(library.getMediaSubDirsFrom(parentDir));
            parentDir.MediaSubDirs.map((subDir) => {
                subDir.Episodes = removeIgnored(library.getMediaSubDirEpisodesFrom(subDir));
                return subDir;
            });
            return parentDir;
        });


    let mediaSubDirs = removeIgnored(library.getMediaSubDirsFrom(lib))
        .map((subDir) => {
            subDir.Episodes = removeIgnored(library.getMediaSubDirEpisodesFrom(subDir));
            return subDir;
        });

    let updatedLib = db.Library.build({
        name: lib.name,
        path: lib.path,
        type: lib.type,
        // Add all media parent dirs and child sub dirs under media parent dirs
        MediaParentDirs: mediaParentDirs,
        // Add all media sub dirs directly under library
        MediaSubDirs: mediaSubDirs,
    }, {
        include: includes
    });


    if (!existingLib)
        return updatedLib.save();

    // Record already exists. Update library data.

});
在上面的代码中,我正在阅读库目录并收集有关MediaParentDir和前面提到的其他模型的所有信息。最后,我用定义的所有嵌套关联构建了一个库实例

现在,如果库已经存在,我需要更新与之关联的数据及其模型。我已经尝试了一些方法:

  • Library.upsert()
    但这不会更新关联
  • Library.update()
    同上
  • embed.update()
    from,但这要求我明确提供对象ID
是否有其他方法可以更新关联的模型实例

任何帮助都将不胜感激。谢谢。

自动续集到可用于更新数据库中相关数据的模型

下面是我用来列出这些方法的代码。在定义关联后将其添加到index.js中,并重新启动节点服务器

   for (let assoc of Object.keys(db[modelName].associations)) {
    for (let accessor of Object.keys(db[modelName].associations[assoc].accessors)) {
      console.log(db[modelName].name + '.' + db[modelName].associations[assoc].accessors[accessor]+'()');
    }

据我所知,本例中的setter用于关联两个已经存在的记录。我正在尝试更新已关联记录中的数据。