Как вставить тип данных ARRAY, используя knex и potsgres - PullRequest
0 голосов
/ 01 мая 2018

Я решаю эту проблему, и у меня заканчивается время, поэтому, пожалуйста, если кто-нибудь может помочь: Я хочу вставить эти данные:

const data= {
id:user.id,
choice:'SWOT',
label:['Strengths','Weaknesses','Opportunities','Threats'],
results:[45,5,20,30],
description:'My first Strategic Analysis'}

в эту таблицу:

analyses (
id serial primary key,
userID integer not null,
choice varchar(25) not null,
Label text ARRAY,
Results integer ARRAY,  
description varchar(200),
FOREIGN KEY (userID) REFERENCES users (id)

);

Используя knex, это должно быть что-то вроде:

db('analyses').insert({
        userid: data.id,
        choice: data.choice,
        Label:  data.labelG,
        Results: data.resultG,
        description: data.description
    }) 

Поскольку этот синтаксис не работает для типов ARRAY, мне интересно, как это сделать? Некоторые предлагали использовать knex.raw (), однако я не могу получить правильный синтаксис для этого Любая помощь?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Вы можете напрямую передавать массивы javascript в столбцы типа ARRAY. Как это:

await knex.schema.createTable('foo', t => {
  t.increments('id');
  t.specificType('intarray', 'integer ARRAY');
  t.specificType('stringarray', 'text ARRAY');
});

await knex('foo').insert({ intarray: [4,3,2,1], stringarray: ['foo','bar'] });

const rows = await knex('foo');
console.log(rows);

// should output: 
// [ anonymous { id: 1, intarray: [ 4,3,2,1 ], stringarray: [ 'foo', 'bar' ] } ]
0 голосов
/ 01 мая 2018

Для текстового массива Postgresql вам нужно хранить ваши данные как:

{'Strengths','Weaknesses','Opportunities','Threats'}

Для этого вы можете создать функцию для преобразования ее в общее использование.

db('analyses').insert({
    userid: data.id,
    choice: data.choice,
    Label:  '{"' + data.labelG.join('","') + '"}',
    Results: data.resultG,
    description: data.description
})

Также вам нужно конвертировать их, когда вы их тоже получили.

...