Разбиение массива объектов на отдельные переменные для хранения базы данных (React, express, sql server) - PullRequest
0 голосов
/ 18 февраля 2020

В моем приложении reactjs хранится массив объектов, который при входе в консоль выглядит следующим образом.

0: {answer: "yes↵", question: "Is the keyboard separate from the screen?", state: "Declined with soloution defined"}
1: {answer: "yes", question: "Does the keyboard tilt?", state: "Accepted"}
2: {answer: "Question declined But not a problem", question: "Is it possible to find a comfortable typing postion?", state: "Accepted"}
3: {answer: "yes", question: "Do you have a good keyboard technique?", state: "Accepted"}
4: {answer: "Question declined But not a problem", question: "Are the characters on the keyboard clear and readable?", state: "Accepted"}
5: {answer: "sgdfgdfgdf", question: "Is your mouse or other pointing device suitable to the task you're using it for?", state: "problem specified"}
6: {answer: "yes", question: "Is the mouse (or other pointing device) located sufficently close to you?  ", state: "Accepted"}
7: {answer: "sdfsdfsdfsd", question: "Is there support for your wrist and forearm when using the mouse(or other pointing device)", state: "Declined with soloution defined"}
8: {answer: "yes", question: "Does the mouse (or other pointing device) work smoothly at a speed that suits you?", state: "Accepted"}
9: {answer: "asdasdas", question: "Can you easily adjust the software settings for speed and accuracy of the pointer?", state: "Declined with soloution defined"}
10: {answer: "asdasdads", question: "Are the characters on your screen clear and readable?", state: "problem specified"}
11: {answer: "yes", question: "Is the text size on your screen confortable to read?", state: "Accepted"}
12: {answer: "asdasdasd", question: "Is the image on your screen free from flicker and jitter?", state: "Declined with soloution defined"}
13: {answer: "asdasdasd", question: "Is your screen's specification suitable for its intended use?", state: "problem specified"}
14: {answer: "yes", question: "Is the brightness and/or contrast on your screen adjustable?", state: "Accepted"}

это состоит из ответа, вопроса и состояния (состояние отвеченного вопроса, а не состояние, как в компонентах реагирования)

Я хотел бы передать их на express чтобы я мог загрузить их в свою базу данных SQL, используя пакет npm ms sql. Однако, поскольку они все хранятся в массиве, я не уверен, как их разделить.

В идеале я хотел бы передать весь объект в SQL и просто сохранить все это в базе данных, например (псевдокод)

insert into table where answer = answer and question = question and state = state

По существу, использовать это с SQL как бы я разбил их для использования с моим бэкэндом или я могу передать весь объект с помощью указанной c SQL хранимой процедуры.

create procedure StoreAnswers

@{answer_values}
as

INSERT INTO QuestionResponses                                         
(RUId, QuestionId, Date, QuestionWhenAnswered, QuestionResponse, Accepted, AssignedWorkStation )
VALUES
${answer_values}

РЕДАКТИРОВАТЬ

Сохранено процедура

create procedure StoreAnswers(@Results varchar(max))
as begin
  insert into QuestionResponses(QuestionResponse, QuestionWhenAnswered, State)
         select substring(value, charindex('{answer: "', value) + 10,  charindex('", ', value, charindex('{answer: "', value) + 10) -  charindex('{answer: "', value) - 10) as answer, 
                substring(value, charindex('question: "', value) + 11, charindex('", ', value, charindex('question: "', value) + 11) - charindex('question: "', value) - 11) as question,
                substring(value, charindex('state: "', value) + 8,      charindex('"}', value,  charindex('state: "', value) + 8) -     charindex('state: "', value) - 8) as state
         from string_split(@Results, char(10))    
end;

Как она передается в запрос sql из express npm

app.post("/post-question-answers", async (req, res) => {
  console.log("!called");

  let results = req.body.results;

  console.info(results);

  await sql.connect(config, function(err) {
    if (err) console.log(err);

    // create Request object
    var request = new sql.Request();
    request.input("Results", sql.VarChar, results);
    // query to the database and get the records
    request.execute("dbo.StoreAnswers", function(err, recordset) {
      if (err) console.log(err);
      // send records as a response
      res.json(recordset);
    });
  });

  res.statusCode = 400;
  res.statusMessage = "bad request";
  // res.json({ message: "Email Missing" });
});


Это console.info (результаты)

[
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is the keyboard separate from the screen?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Does the keyboard tilt?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is it possible to find a comfortable typing postion?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Do you have a good keyboard technique?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Are the characters on the keyboard clear and readable?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: "Is your mouse or other pointing device suitable to the task you're using it for?",
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is the mouse (or other pointing device) located sufficently close to you?  ',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is there support for your wrist and forearm when using the mouse(or other pointing device)',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Does the mouse (or other pointing device) work smoothly at a speed that suits you?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Can you easily adjust the software settings for speed and accuracy of the pointer?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Are the characters on your screen clear and readable?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is the text size on your screen confortable to read?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is the image on your screen free from flicker and jitter?',
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: "Is your screen's specification suitable for its intended use?",
[0]     state: 'Accepted'
[0]   },
[0]   {
[0]     answer: 'yes',
[0]     question: 'Is the brightness and/or contrast on your screen adjustable?',
[0]     state: 'Accepted'
[0]   }
[0] ]

ошибка

RequestError: Invalid length parameter passed to the LEFT or SUBSTRING function.

Ответы [ 5 ]

1 голос
/ 18 февраля 2020

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

Строки по-прежнему разделяются с помощью функции string_split с символ перевода строки.

create procedure StoreAnswers(@text varchar(max))
as begin
  insert into QuestionResponses(question, answer, state)
  select json_value(json, '$.question') as question,
         json_value(json, '$.answer') as answer,
         json_value(json, '$.state') as state
  from (select replace(replace(replace(substring(value, charindex('{', value), len(value)), 'answer: ', '"answer": '), 'question: ', '"question": '), 'state: ', '"state": ') as json
        from string_split(@source, char(10))
        where value like '%{%}%') as jsons
end;

json_value - это функция SQL, которая извлекает значение из строки json.

Пример преобразования из исходная строка к json. От:

0: {ответ: «да», вопрос: «Клавиатура отделена от экрана?», Состояние: «Отклонено с определением решения»}

... мы конвертируем его в:

{"answer": "yes", "question": "Клавиатура отделена от экрана?", "state": "Отклонено с разрешением определенные "}

Мы просто удаляем начальный номер строки и добавляем к идентификаторам кавычки. Это выражение выполняет эти изменения:

replace(replace(replace(substring(value, charindex('{', value), len(value)), 'answer: ', '"answer": '), 'question: ', '"question": '), 'state: ', '"state": ')

Здесь вы можете в реальном времени извлечь извлечение каждого значения из исходного текста: http://sqlfiddle.com/#! 18 / 9eecb / 74419

1 голос
/ 18 февраля 2020

Вы можете использовать string_split с символом перевода строки, чтобы разделить текст на строки, а затем использовать подстроку для разделения значений в этих строках, используя charindex для определения их позиций.

declare @text varchar(max) = 
'0: {answer: "yes↵", question: "Is the keyboard separate from the screen?", state: "Declined with soloution defined"}
1: {answer: "yes", question: "Does the keyboard tilt?", state: "Accepted"}
2: {answer: "Question declined But not a problem", question: "Is it possible to find a comfortable typing postion?", state: "Accepted"}
3: {answer: "yes", question: "Do you have a good keyboard technique?", state: "Accepted"}
4: {answer: "Question declined But not a problem", question: "Are the characters on the keyboard clear and readable?", state: "Accepted"}
5: {answer: "sgdfgdfgdf", question: "Is your mouse or other pointing device suitable to the task you''re using it for?", state: "problem specified"}
6: {answer: "yes", question: "Is the mouse (or other pointing device) located sufficently close to you?  ", state: "Accepted"}
7: {answer: "sdfsdfsdfsd", question: "Is there support for your wrist and forearm when using the mouse(or other pointing device)", state: "Declined with soloution defined"}
8: {answer: "yes", question: "Does the mouse (or other pointing device) work smoothly at a speed that suits you?", state: "Accepted"}
9: {answer: "asdasdas", question: "Can you easily adjust the software settings for speed and accuracy of the pointer?", state: "Declined with soloution defined"}
10: {answer: "asdasdads", question: "Are the characters on your screen clear and readable?", state: "problem specified"}
11: {answer: "yes", question: "Is the text size on your screen confortable to read?", state: "Accepted"}
12: {answer: "asdasdasd", question: "Is the image on your screen free from flicker and jitter?", state: "Declined with soloution defined"}
13: {answer: "asdasdasd", question: "Is your screen''s specification suitable for its intended use?", state: "problem specified"}
14: {answer: "yes", question: "Is the brightness and/or contrast on your screen adjustable?", state: "Accepted"}'

select substring(value, charindex('{answer: "', value) + 10, charindex('", ', value, charindex('{answer: "', value) + 10) - charindex('{answer: "', value) - 10) as answer, 
       substring(value, charindex('question: "', value) + 11, charindex('", ', value, charindex('question: "', value) + 11) - charindex('question: "', value) - 11) as question,
       substring(value, charindex('state: "', value) + 8, charindex('"}', value, charindex('state: "', value) + 8) - charindex('state: "', value) - 8) as state
from string_split(@text, char(10))

Вы можете увидеть вот что извлечение работает: http://sqlfiddle.com/#! 18 / 9eecb / 74353

Таким образом, хранимая процедура, которая принимает ваш текст и вставляет его в вашу таблицу, будет:

create procedure StoreAnswers(@text varchar(max))
as begin
  insert into QuestionResponses(answer, question, state)
         select substring(value, charindex('{answer: "', value) + 10,  charindex('", ', value, charindex('{answer: "', value) + 10) -  charindex('{answer: "', value) - 10) as answer, 
                substring(value, charindex('question: "', value) + 11, charindex('", ', value, charindex('question: "', value) + 11) - charindex('question: "', value) - 11) as question,
                substring(value, charindex('state: "', value) + 8,      charindex('"}', value,  charindex('state: "', value) + 8) -     charindex('state: "', value) - 8) as state
         from string_split(@text, char(10))    
end;
1 голос
/ 18 февраля 2020

Я не могу много рассказать о том, как написать это в express, но вам нужен SQL запрос, такой как

INSERT INTO `table_name`                                           
(answer, question, created_at, updated_at)
VALUES
${sql_insert_values}

sql_insert_values ​​будет массивом строк, разделенных запятыми ценность. Каждая строка будет представлять одно поле и будет иметь разделенные запятыми значения для каждого столбца.

Добавьте ON DUPLICATE KEY UPDATE value = VALUES(value), если у вас есть какой-то уникальный ключ или индекс в каком-либо поле.

Не стесняйтесь спросите, если у вас есть сомнения.

PS: значения, отправляемые на SQL, будут иметь формат:

["(question value in string, answer value in string, date-time, date-time)", "()", "()"]. Вот более простой пример запроса:

INSERT INTO tbl_name (a,b,c) 
VALUES(1,2,3), (4,5,6), (7,8,9);

Обратитесь к нему за дополнительной информацией: https://dev.mysql.com/doc/refman/8.0/en/insert.html

0 голосов
/ 18 февраля 2020

Я думаю, вам нужно создать дополнительную таблицу t_servey (id, name, ...) и использовать servey_id в таблице t_question для будущего.

t_question(
id,
servey_id, -- link on t_servey table
answer,
question,
created_at,
updated_at
)

И добавить переменные бининга (?) Для вставки в таблицу:

insert into t_question (servey_id, answer, question, created_at, updated_at) values (?, ?, ?, ?, ?)
0 голосов
/ 18 февраля 2020

почему вы не используете orm с вашим express приложением

, как, например, sequelize, это облегчит вашу жизнь и избавит вас от головной боли при построении оператора sql в вашем приложении

check документация для него https://sequelize.org/

с sequlize в вашем случае

1 - создайте свою таблицу в БД

2 - создайте модель в ваше express приложение для этой таблицы

3 - вызов модели.bulkCreate (весь объект)

попробуйте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...