Как вставить массив в столбец в базе данных гаечного ключа, используя javascript es6 - PullRequest
0 голосов
/ 27 июня 2019

У меня есть следующие данные:

data = {
    id: 10012,
    name: "abc",
    hobby: ["cricket", "football"]
}

Моя структура таблицы: id int64, Строка имени (25), строка petName (20), хобби (25)

Как вставить массив данных в таблицу ключей?

async insert(data) {
    const result;
    const params = {
        id: data.id,
        name: data.name,
        petName: null
    }
    await data.hobby.map(async h => {
        params.hobby = h;
        const query = 'INSERT INTO my_table (id, name, petName, hobby) VALUES (@id, @name, @petName, @hobby)';
        result = await db.RunTrans(query, params);
    });
    return result;
}

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

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

Удалите нужные значения (чтобы избежать ненужных повторяющихся точечных обозначений), затем используйте литералы шаблона:

async insert(data) {
    const result;
    const params = {
        id: data.id,
        name: data.name,
        petName: null
    }
    await data.hobby.map(async h => {
        params.hobby = h;
        const { id, name, petName, hobby } = params;
        const query = `INSERT INTO my_table (id, name, petName, hobby) VALUES (${id}, ${name}, ${petName}, ${hobby})`;
        result = await db.RunTrans(query, params);
    });
    return result;
}
1 голос
/ 29 июня 2019

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

  1. Я не уверен, что ваши столбцы обнуляются.Если они не являются petName, то значение NULL недопустимо для схемы.
  2. @ google-cloud / spanner не имеет метода RunTrans.хотя он имеет метод runTransaction и runTransactionAsync.
  3. При таком способе код приводит к появлению нескольких строк с одинаковым идентификатором.Как правило, идентификатор будет установлен на первичный ключ.Поскольку я предполагаю, что это не ошибка, я создал первичный ключ, который представляет собой смесь хобби и идентификатора, поскольку это будет уникально.

Документация для runTransactionAsync находится здесь: https://cloud.google.com/nodejs/docs/reference/spanner/3.1.x/Database.html#runTransactionAsync

const {Spanner} = require('@google-cloud/spanner');

const spanner = new Spanner();

const instance = spanner.instance('testinstance');
const db = instance.database('people');

async function insert(data) {
    const params = {
        id: data.id,
        name: data.name,
        petName: null
    }

    const query = 'INSERT INTO my_table (id, name, petName, hobby) VALUES (@id, @name, @petName, @hobby)';
    await Promise.all(data.hobby.map(async h => {
        await db.runTransactionAsync(async (transaction) => {
            params.hobby = h;
            await transaction.run({
                sql: query,
                params: params,
                types: {
                    petName: {
                        type: 'string'
                    }, 
                }
            });
            await transaction.commit();
        });
    }));
};

insert({id: 0, name: 'foo', hobby:['a','b','c'], extra: 'blah'}).catch((r) => console.log(r))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...