sequelize association test

This commit is contained in:
Ciro Santilli 六四事件 法轮功
2021-05-29 01:00:00 +00:00
parent c6bf5d990d
commit 6e15ee4b3c
2 changed files with 94 additions and 1 deletions

View File

@@ -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();
})();

View File

@@ -11,6 +11,7 @@
// `` // ``
const assert = require('assert'); const assert = require('assert');
const path = require('path');
const { Sequelize, DataTypes } = require('sequelize'); const { Sequelize, DataTypes } = require('sequelize');
@@ -29,7 +30,7 @@ const { Sequelize, DataTypes } = require('sequelize');
//}); //});
const sequelize = new Sequelize({ const sequelize = new Sequelize({
dialect: 'sqlite', dialect: 'sqlite',
storage: 'tmp.sequelize.sqlite', storage: 'tmp.' + path.basename(__filename) + '.sqlite',
}); });
// OMG fuck this asynchronous bullshit: // OMG fuck this asynchronous bullshit: