【问题标题】:How to insert array into a column in spanner database using javascript es6如何使用javascript es6将数组插入spanner数据库中的列
【发布时间】:2019-11-09 07:54:19
【问题描述】:

我有以下数据:

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

我的表结构是: id int64, 名称字符串(25), 宠物名称字符串(20), 爱好字符串(25)

如何将数据数组插入到 spanner 表中?

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;
}

上面的代码没有将值插入到表中。请帮我解决这个问题..

【问题讨论】:

  • 这段代码有错误吗?查询可能应该在一个字符串中; IE。 query = "INSERT INTO..."
  • 使用 async/await 会产生意想不到的结果。返回承诺并使用 .then() 代替。
  • @lipsumar 这是一个字符串。对不起,我忘了提出问题。我更新了问题..
  • paramas 用于代替paramsquery 包含语法错误。请先解决这些问题
  • @briosheje 我忘了把它放在问题中。我刚刚更新了问题..

标签: javascript node.js object ecmascript-6 google-cloud-spanner


【解决方案1】:

解构出想要的值(以避免不必要的重复点符号)然后使用模板文字:

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;
}

【讨论】:

  • 这并没有改善兄弟。我得到的结果与我的代码结果相同..
【解决方案2】:

您没有处理任何承诺问题,因此可能会有一些不同的事情。

  1. 我不确定您的列是否可以为空。如果它们不是 petName,则为 NULL 对架构无效。
  2. @google-cloud/spanner 没有 RunTrans 方法。不过它有一个runTransaction 和一个runTransactionAsync 方法。
  3. 按照这种编写方式,代码会产生具有相同 ID 的多行。通常 id 会被设置为主键。由于我认为这没有错误,因此我创建了一个由 hobby 和 id 组合而成的主键,因为这将是唯一的。

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))

【讨论】:

    猜你喜欢
    • 2019-04-05
    • 2020-03-07
    • 1970-01-01
    • 2017-07-09
    • 2019-09-25
    • 2011-04-13
    • 2019-09-26
    • 2018-01-31
    • 2019-07-08
    相关资源
    最近更新 更多