访问返回的对象本身的属性没有什么特别之处,只是
users
被
findAll()
Array
,为了返回每个结果,需要对其进行迭代:
let users = await User.findAll();
for ( let user of users ) {
log(`${user.firstname} ${user.email}`);
}
因此,当您实际打算返回多个结果时,可以使用它。如果您的意思是“一”,那么您可以使用
findByPk()
:
let bill = await User.findByPk(1);
log(`${bill.firstname} ${bill.lastname}`);
findOne()
:
let ted = await User.findOne({ where: { firstname: 'Ted' } });
log(`${ted.firstname} ${ted.lastname}`);
在这两种情况下,返回的对象都是单数的,而不是在数组中,因为它与期望返回列表的方法是一样的。因此,只要使用正确的方法只返回一个对象,就可以像预期的那样访问属性。
有关这些语句在上下文中的工作方式,请参见下面的完整列表。
现代异步/等待
const { Op, SMALLINT, STRING } = Sequelize = require('sequelize');
const logging = log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize('sqlite:dbname.db', { logging });
const User = sequelize.define('users', {
id: { type: SMALLINT, primaryKey: true },
firstname: STRING(50),
lastname: STRING(50),
email: STRING(50),
pass: STRING(50)
});
(async function() {
try {
await sequelize.authenticate();
await User.sync({ force: true });
let result = await sequelize.transaction(transaction =>
Promise.all(
[
[1, 'Bill', 'Preston', 'bill.s@stalyns.org', 'password'],
[2, 'Ted', 'Logan', 'ted.t@styalyns.org', 'secret']
].map(([id, firstname, lastname, email, pass]) =>
User.create({ id, firstname, lastname, email, pass }, { transaction })
)
)
);
let users = await User.findAll();
for ( let user of users ) {
log(`${user.firstname} ${user.email}`);
}
let bill = await User.findByPk(1);
log(`${bill.firstname} ${bill.lastname}`);
let ted = await User.findOne({ where: { firstname: 'Ted' } });
log(`${ted.firstname} ${ted.lastname}`);
} catch(e) {
console.error(e)
} finally {
process.exit()
}
})()
普通承诺链
const { Op, SMALLINT, STRING } = Sequelize = require('sequelize');
const logging = log = data => console.log(JSON.stringify(data, undefined, 2));
const sequelize = new Sequelize('sqlite:dbname.db', { logging });
const User = sequelize.define('users', {
id: { type: SMALLINT, primaryKey: true },
firstname: STRING(50),
lastname: STRING(50),
email: STRING(50),
pass: STRING(50)
});
sequelize.authenticate()
.then(() => User.sync({ force: true }) )
.then(() => sequelize.transaction(transaction =>
Promise.all(
[
[1, 'Bill', 'Preston', 'bill.s@stalyns.org', 'password'],
[2, 'Ted', 'Logan', 'ted.t@styalyns.org', 'secret']
].map(([id, firstname, lastname, email, pass]) =>
User.create({ id, firstname, lastname, email, pass }, { transaction })
)
)
))
.then(() => User.findAll() )
.then(users => {
for ( let user of users ) {
log(`${user.firstname} ${user.email}`);
}
})
.then(() => User.findByPk(1) )
.then(bill => log(`${bill.firstname} ${bill.lastname}`) )
.then(() => User.findOne({ where: { firstname: 'Ted' } }) )
.then(ted => log(`${ted.firstname} ${ted.lastname}`) )
.catch(console.error)
.then(() => process.exit());
两个列表创建相同的输出。已启用日志记录,因此您可以在上看到针对每个操作发送到数据库引擎的SQL语句:
"Executing (default): SELECT 1+1 AS result"
"Executing (default): DROP TABLE IF EXISTS `users`;"
"Executing (default): CREATE TABLE IF NOT EXISTS `users` (`id` SMALLINT PRIMARY KEY, `firstname` VARCHAR(50), `lastname` VARCHAR(50), `email` VARCHAR(50), `pass` VARCHAR(50), `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL);"
"Executing (default): PRAGMA INDEX_LIST(`users`)"
"Executing (default): PRAGMA INDEX_INFO(`sqlite_autoindex_users_1`)"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): BEGIN DEFERRED TRANSACTION;"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): INSERT INTO `users` (`id`,`firstname`,`lastname`,`email`,`pass`,`createdAt`,`updatedAt`) VALUES (1,'Bill','Preston','bill.s@stalyns.org','password','2018-11-24 04:09:00.628 +00:00','2018-11-24 04:09:00.628 +00:00');"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): INSERT INTO `users` (`id`,`firstname`,`lastname`,`email`,`pass`,`createdAt`,`updatedAt`) VALUES (2,'Ted','Logan','ted.t@styalyns.org','secret','2018-11-24 04:09:00.629 +00:00','2018-11-24 04:09:00.629 +00:00');"
"Executing (9218ce2c-7c99-4b3a-ac48-9ae5f1d832d4): COMMIT;"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users`;"
"Bill bill.s@stalyns.org"
"Ted ted.t@styalyns.org"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`id` = 1;"
"Bill Preston"
"Executing (default): SELECT `id`, `firstname`, `lastname`, `email`, `pass`, `createdAt`, `updatedAt` FROM `users` AS `users` WHERE `users`.`firstname` = 'Ted' LIMIT 1;"
"Ted Logan"