我正在使用knex进行播种,我有一个名为development的文件夹,其中有所有种子文件。
我想要的是:如何播种单个文件。
我正在使用的命令是:knex seed:run --env=development但是这个命令是播种所有文件,我在 db 上得到重复的行。
假设我昨天创建了种子文件,并将它们设定为种子,今天我想添加另一个种子文件,我只想为该文件设定种子,而不是昨天的文件。
Laravel的一个例子是:php artisan db:seed --class=ProductTableSeeder
谢谢
>对于那些在2019+中检查此内容的人
根据膝盖文档
要运行特定的种子文件,请执行:
$ knex seed:run --specific=seed-filename.js
只需将脚本移动到所需脚本以外的另一个文件夹,运行种子并将脚本复制回来。
种子 API 只有两个命令,make 和 run。这是来自文档。
runknex.seed.run([config])
运行当前环境的所有种子文件。
因此,所有脚本都将在每次运行时执行
不起作用:knex seed:run --specific=seed-filename.js
- 在数据库knex_seed_lock表中创建
- 将此添加到种子文件:
const file_name = path.basename(__filename)
const seedIsExist = await knex('knex_seeds_lock').where({ file_name }).first()
if (seedIsExist) {
return
}
- 并将其添加到文件末尾:
await knex('knex_seeds_lock').insert({ file_name })
结果,在数据库中,您将获得之前已经运行的所有种子
就我个人而言,我只是将我的承诺包装在 export.up/if (boolean) {...}
down 中,并将我不想运行的那些切换为 false。
Artem的解决方案工作正常:你只需要创建表:knex_seeds_lock
我使用的代码在这里:
`
const path = require('path')
exports.seed = async (knex) => {
try {
const file_name = path.basename(__filename)
const seedIsExist = await knex('knex_seeds_lock').where({ file_name }).first()
if (seedIsExist) {
return
} else {
await knex('users_types').del();
await knex('knex_seeds_lock').insert({ file_name })
await knex('users_types').insert([
{name: 'client'},
{name: 'driver'},
{name: 'admin'}
]);
return;
}
} catch (err) {
console.log("ERROR SEEDING")
console.log(err);
}
}`
@Madison_Lai的答案是正确的,但与对该答案的评论类似,我的--specific
标志也被忽略了。
TLDR:添加--
分隔符解决了我的问题。
npm run knex seed:run -- --specific=seed-filename.js
详:
就我而言,package.json
中的knex
脚本包含一个传递的参数,当我尝试通过 CLI 传递其他参数时,最终会导致排序问题。
在package.json
"scripts": {
"knex": "./path/to/knex --knexfile=./path/to/knexfile.js"
}
在 CLI 中,
npm run knex seed:run --specific=seed-filename.js
被解析如下,完全失去了--specific
参数
./path/to/knex --knexfile=./path/to/knexfile.js "seed:run"
在传递附加参数之前前缀--
(如此处建议)为我解决了问题
npm run knex seed:run -- --specific=seed-filename.js