diff --git a/rootfs_overlay/lkmc/nodejs/sequelize/association.js b/rootfs_overlay/lkmc/nodejs/sequelize/association.js new file mode 100755 index 0000000..b22f85b --- /dev/null +++ b/rootfs_overlay/lkmc/nodejs/sequelize/association.js @@ -0,0 +1,92 @@ +#!/usr/bin/env node + +const assert = require('assert'); +const path = require('path'); + +const { Sequelize, DataTypes } = require('sequelize'); + +const sequelize = new Sequelize({ + dialect: 'sqlite', + storage: 'tmp.' + path.basename(__filename) + '.sqlite', +}); +(async () => { +const Comment = sequelize.define('Comment', { + body: { type: DataTypes.STRING }, +}, {}); +const User = sequelize.define('User', { + name: { type: DataTypes.STRING }, +}, {}); +User.hasMany(Comment) +Comment.belongsTo(User) +await sequelize.sync({force: true}); +const u0 = await User.create({name: 'u0'}) +const u1 = await User.create({name: 'u1'}) +await Comment.create({body: 'u0c0', UserId: u0.id}); +await Comment.create({body: 'u0c1', UserId: u0.id}); +await Comment.create({body: 'u1c0', UserId: u1.id}); + +// Direct way. +{ + const u0Comments = await Comment.findAll({ + where: { UserId: u0.id }, + order: [['id', 'ASC']], + }); + assert(u0Comments[0].body === 'u0c0'); + assert(u0Comments[1].body === 'u0c1'); + assert(u0Comments[0].UserId === u0.id); + assert(u0Comments[1].UserId === u0.id); + // Not added as an object by default. Would require extra query. + assert(u0Comments[0].User === undefined); + assert(u0Comments[1].User === undefined); +} + +// Include data from the other side of the association in the query. +{ + const u0Comments = await Comment.findAll({ + where: { UserId: u0.id }, + order: [['id', 'ASC']], + include: [{ model: User }], + }); + assert(u0Comments[0].body === 'u0c0'); + assert(u0Comments[1].body === 'u0c1'); + assert(u0Comments[0].UserId === u0.id); + assert(u0Comments[1].UserId === u0.id); + // These did get added now. + assert(u0Comments[0].User.name === 'u0'); + assert(u0Comments[1].User.name === 'u0'); +} + +// Nicer higher level way. +{ + const u0Comments = await u0.getComments({ + include: [{ model: User }], + }); + assert(u0Comments[0].body === 'u0c0'); + assert(u0Comments[1].body === 'u0c1'); + assert(u0Comments[0].User.name === 'u0'); + assert(u0Comments[1].User.name === 'u0'); +} + +// No way to create new item with association without explicit foreign key?? +// https://stackoverflow.com/questions/34059081/how-do-i-reference-an-association-when-creating-a-row-in-sequelize-without-assum +// This does not work as we would like: +{ + await Comment.create({body: 'u0c2', User: u0}); + // We'd want 3 here. + assert((await Comment.findAll({ + where: { UserId: u0.id }, + })).length === 2); +} + +// Removal auto-cascades. +const u0id = u0.id +await u0.destroy() +assert((await Comment.findAll({ + where: { UserId: u0id }, +})).length === 0); +assert((await Comment.findAll({ + where: { UserId: u1.id }, +})).length === 1); + +await sequelize.close(); +})(); diff --git a/rootfs_overlay/lkmc/nodejs/sequelize.js b/rootfs_overlay/lkmc/nodejs/sequelize/index.js similarity index 98% rename from rootfs_overlay/lkmc/nodejs/sequelize.js rename to rootfs_overlay/lkmc/nodejs/sequelize/index.js index 48d957b..1c31b4e 100755 --- a/rootfs_overlay/lkmc/nodejs/sequelize.js +++ b/rootfs_overlay/lkmc/nodejs/sequelize/index.js @@ -11,6 +11,7 @@ // `` const assert = require('assert'); +const path = require('path'); const { Sequelize, DataTypes } = require('sequelize'); @@ -29,7 +30,7 @@ const { Sequelize, DataTypes } = require('sequelize'); //}); const sequelize = new Sequelize({ dialect: 'sqlite', - storage: 'tmp.sequelize.sqlite', + storage: 'tmp.' + path.basename(__filename) + '.sqlite', }); // OMG fuck this asynchronous bullshit: