Как указать один файл, который будет только семенем

Я использую knex для заполнения, и у меня есть папка под названием development, в которой у меня есть все файлы семян.

Я бы хотел: как заполнить один файл.

Я использую следующую команду: knex seed:run --env=development Но эта команда предназначена для заполнения всех файлов, и я получаю повторяющиеся строки в базе данных.

Предположим, вчера я создал начальные файлы и заполнил их, сегодня я хочу добавить еще один начальный файл, который я хочу заполнить только этим файлом, а не вчерашними файлами.

Пример из Laravel: php artisan db:seed --class=ProductTableSeeder

Спасибо


person Lulzim    schedule 28.04.2015    source источник


Ответы (5)


Для тех из вас, кто проверяет это в 2019+

Согласно документации knex

Чтобы запустить определенный начальный файл, выполните:

$ knex seed:run --specific=seed-filename.js
person Madison Lai    schedule 16.10.2019
comment
Привет. Спасибо за обновление, но оно все еще не работает. Как будто --specific даже нет, а все мои семена разбегаются :( Есть идеи, почему? - person Sebastian; 19.12.2019
comment
Я не уверен, не видя больше кода, но путь к каталогу семян в вашем knexfile.js настроен так, чтобы указывать на вашу папку семян? - person Madison Lai; 19.12.2019

Просто переместите свои скрипты в другую папку, кроме нужного скрипта, запустите сид и скопируйте скрипты обратно.

seed API содержит только две команды: make и run. Это из документов.

runknex.seed.run([config])

Запускает все исходные файлы для текущей среды.

Таким образом, все сценарии будут выполняться при каждом запуске.

person devconcept    schedule 28.04.2015
comment
Если я сделаю это таким образом, то мне следует сделать начальное число для каждой конкретной папки, если я хочу выполнить начальные файлы на другом компьютере ?? - person Lulzim; 28.04.2015
comment
Вы также можете написать пакет для переименования других сценариев, чтобы knex в качестве альтернативы игнорировал их при выполнении семян, но если вы оставите их в папке, они будут выполнены. Также они будут запускаться в алфавитном порядке, поэтому вы должны быть осторожны с именами скриптов. - person devconcept; 28.04.2015
comment
Я использую числа в качестве префикса, например: 01, 02, поэтому у меня нет проблем с порядком, что касается партии, я не понимаю, как вы действительно это имеете в виду? - person Lulzim; 28.04.2015
comment
Предоставляет ли knex какую-либо опцию, подобную этой: knex seed:run --file=nameOfFile - person Lulzim; 28.04.2015
comment
Не то, что я знаю о. Я имею в виду, что если вы переименуете seed_table1.js в seed_table1.ttt, он не будет выполнен. Точно так же, если вы оставите свой целевой скрипт в папке в покое. Это ваши варианты. В исходном коде сказано, что все, что заканчивается на '.co', '.coffee', '.iced', '.js', '.litcoffee', '.ls', будет добавлено в стек и выполнено. - person devconcept; 28.04.2015
comment
Жду, пока кто-то еще даст ответ, так как сейчас я не могу принять ваш ответ, так как он не полностью удовлетворяет мои потребности: s В любом случае, спасибо за ваш ответ, давайте посмотрим, есть ли лучший способ. - person Lulzim; 28.04.2015
comment
Хорошо я понял ;). Если вы хотите узнать, какие у вас есть варианты, вам следует перейти в папку npm и найти файл npm\node_modules\knex\lib\seed\index.js. В строке 42 находится метод Seeder.prototype._listAll. Это тот, у которого есть задача найти целевые файлы для раздачи. - person devconcept; 28.04.2015

Не работает: knex seed:run --specific=seed-filename.js

  1. создать в БД таблицу knex_seed_lock
  2. Добавьте это в файл seed:

const file_name = path.basename(__filename)
  const seedIsExist = await knex('knex_seeds_lock').where({ file_name }).first()

  if (seedIsExist) {
    return
  }

  1. И добавьте это в конец файла:

await knex('knex_seeds_lock').insert({ file_name })

В результате в базе вы получите все сиды, которые вы уже запускали ранее

person Artem Bielykh    schedule 16.04.2020

Лично я просто заключаю свое обещание в exports.up/down в if (boolean) {...} и переключаю те, которые я не хочу запускать, на false.

person jpstone    schedule 27.10.2015

Решение от Артема отлично работает: нужно просто создать таблицу: 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);
         }
    }`
person aazcast    schedule 08.07.2020