Как получить массив в SQlite3 с помощью Express + Knex + Node.js?

Работаю над приложением типа рецепта, и я работаю над файлами route/endpoints/backend. Команде нужна следующая структура JSON для получения запроса GET.

const fakeDataRecipes = [
    {
        id:0,
        title:"PBJ",
        source:"Mother",
        ingredients:["bread", "peanut butter", "jam"],
        instructions: "1. Get bread. 2. Get peanut butter and jam. 3. Put together.",
        category:["snack", "dinner", "vegetarian", "sandwich"],
        user_id:1
    }, 
    {
        id:1,
        title:"Peanut Butter and Banana Sandwich",
        source:"Uncle Steve",
        instructions: "1. Get bread. 2. Get peanut butter. 3. Slice banana. 4. Put together",
        ingredients:["bread", "peanut butter", "banana", "chocolate"],
        category:["snack", "dinner", "vegetarian", "sandwich"],
        user_id:2
    }
];

Я искал, но мне кажется, что SQLITE3 не поддерживает массивы в столбцах. как лучше поступить в этой ситуации? Мне нужны ингредиенты и категория, чтобы быть массивом. Некоторые люди говорят: «Создайте новую таблицу для ингредиентов и категорий». Другие говорят об использовании типа данных blob в SQLite3, с которым я не знаком. Или просто сохраните его как строку, а затем скройте его в массив, который, я не уверен, сработает или создаст проблемы для внешнего интерфейса. ниже приведен файл миграции knex



exports.up = function(knex) {

  return knex.schema.createTable('recipes', recipeColumn=>{

    recipeColumn.increments();
    recipeColumn.text('title').unique().notNullable();
    recipeColumn.text('source').unique().notNullable();


  })

};


person cralam01    schedule 13.07.2019    source источник


Ответы (1)


Нормализация в отдельные таблицы - это путь сюда:

`recipes`: (`title`, `source`)
`ingredients`: (`name`)
`recipes_ingredients`: (`recipe_id`, `ingredient_id`, `quantity`)
`categories`: (`name`)
`categories_recipes`: (`recipe_id`, `category_id`)

В качестве краткого примера, чтобы получить массив ингредиентов для каждого рецепта:

knex.select('name')
  .from('ingredients')
  .join('recipes_ingredients')
  .on('recipes_ingredients.ingredient_id', '=', 'ingredients.id')
  .where('recipes_ingredients.recipe_id', recipeId)

(Не тестировалось, но это будет выглядеть примерно так). Другими словами, используйте таблицу соединения как связующее звено для получения нужных результатов.

О, и см. также этот ответ.

person Rich Churcher    schedule 14.07.2019