通过 knex 插入 faker 数据
Insert faker data via knex
我想通过 knex 插入数据,使用 for look 创建一个对象来插入数据。
我尝试了以下方法:
const faker = require('faker');
const dataLength = 10
const obj = []
exports.seed = function (knex, Promise) {
// Deletes ALL existing entries
return knex('posts').del()
.then(function () {
//create entries
for (var index = 0; index < dataLength; index++) {
obj[index] = {
title: faker.lorem.sentence(),
description: faker.lorem.paragraph(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent(),
deletedAt: faker.date.recent(),
deleted: faker.random.boolean(),
tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
}
knex('posts').insert([,
obj[index]
]);
}
// Inserts seed entries
return
});
};
我的问题是没有数据保存到数据库中。
对我做错了什么有什么建议吗?
您致电 knex.insert()
return 是一个承诺。您需要通过在传递给 then
方法的处理程序中 returning 将其包含在 promise chain 中。通过 return 在 then
处理程序中使用承诺,您实际上是在告诉它等待 那个 承诺解决。因为您 return 什么都不做(具体来说,undefined
),您的种子函数会删除帖子,但不需要知道它必须等待任何其他操作完成才能完成。
将来,如果您对 return 有多个承诺,您可以使用 Promise.all()
来 return 所有承诺:
exports.seed = function (knex, Promise) {
return knex('posts').del()
.then(function () {
return Promise.all([
knex('bar').insert(),
knex('foo').insert(),
])
})
};
然后您的承诺链将等待 Promise.all() 中的所有承诺在继续之前解决。
但是,在这种特殊情况下,无需多次调用 knex.insert()
,因为它可以接受对象数组而不是单个对象:
exports.seed = function (knex, Promise) {
return knex('posts').del()
.then(function () {
const posts = []
for (let index = 0; index < dataLength; index++) {
posts.push({
title: faker.lorem.sentence(),
description: faker.lorem.paragraph(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent(),
deletedAt: faker.date.recent(),
deleted: faker.random.boolean(),
tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
})
}
return knex('posts').insert(posts)
});
};
我想通过 knex 插入数据,使用 for look 创建一个对象来插入数据。
我尝试了以下方法:
const faker = require('faker');
const dataLength = 10
const obj = []
exports.seed = function (knex, Promise) {
// Deletes ALL existing entries
return knex('posts').del()
.then(function () {
//create entries
for (var index = 0; index < dataLength; index++) {
obj[index] = {
title: faker.lorem.sentence(),
description: faker.lorem.paragraph(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent(),
deletedAt: faker.date.recent(),
deleted: faker.random.boolean(),
tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
}
knex('posts').insert([,
obj[index]
]);
}
// Inserts seed entries
return
});
};
我的问题是没有数据保存到数据库中。
对我做错了什么有什么建议吗?
您致电 knex.insert()
return 是一个承诺。您需要通过在传递给 then
方法的处理程序中 returning 将其包含在 promise chain 中。通过 return 在 then
处理程序中使用承诺,您实际上是在告诉它等待 那个 承诺解决。因为您 return 什么都不做(具体来说,undefined
),您的种子函数会删除帖子,但不需要知道它必须等待任何其他操作完成才能完成。
将来,如果您对 return 有多个承诺,您可以使用 Promise.all()
来 return 所有承诺:
exports.seed = function (knex, Promise) {
return knex('posts').del()
.then(function () {
return Promise.all([
knex('bar').insert(),
knex('foo').insert(),
])
})
};
然后您的承诺链将等待 Promise.all() 中的所有承诺在继续之前解决。
但是,在这种特殊情况下,无需多次调用 knex.insert()
,因为它可以接受对象数组而不是单个对象:
exports.seed = function (knex, Promise) {
return knex('posts').del()
.then(function () {
const posts = []
for (let index = 0; index < dataLength; index++) {
posts.push({
title: faker.lorem.sentence(),
description: faker.lorem.paragraph(),
createdAt: faker.date.recent(),
updatedAt: faker.date.recent(),
deletedAt: faker.date.recent(),
deleted: faker.random.boolean(),
tags: faker.random.arrayElement(["tag1", "tag2", "tag3", "tag4"])
})
}
return knex('posts').insert(posts)
});
};