25

可以像这样插入单行:

client.query("insert into tableName (name, email) values ($1, $2) ", ['john', 'john@gmail.com'], callBack)

这种方法会自动注释掉任何特殊字符。

如何一次插入多行?

我需要实现这个:

"insert into tableName (name, email) values ('john', 'john@gmail.com'), ('jane', 'jane@gmail.com')"

我可以使用 js 字符串运算符手动编译这些行,但是我需要以某种方式添加特殊字符转义。

4

5 回答 5

21

使用pg 格式,如下所示。

var format = require('pg-format');

var values = [
  [7, 'john22', 'john22@gmail.com', '9999999922'], 
  [6, 'testvk', 'testvk@gmail.com', '88888888888']
];
client.query(format('INSERT INTO users (id, name, email, phone) VALUES %L', values),[], (err, result)=>{
  console.log(err);
  console.log(result);
});
于 2020-07-30T07:11:08.267 回答
9

使用 PostgreSQL json 函数的另一种方法:

client.query('INSERT INTO table (columns) ' +
  'SELECT m.* FROM json_populate_recordset(null::your_custom_type, $1) AS m',
  [JSON.stringify(your_json_object_array)], function(err, result) {
    if (err) {
      console.log(err);
    } else {
      console.log(result);
    }
});
于 2016-05-11T16:16:46.640 回答
8

在这篇文章之后:pg-promise库的性能提升及其建议的方法:

// Concatenates an array of objects or arrays of values, according to the template,
// to use with insert queries. Can be used either as a class type or as a function.
//
// template = formatting template string
// data = array of either objects or arrays of values
function Inserts(template, data) {
    if (!(this instanceof Inserts)) {
        return new Inserts(template, data);
    }
    this._rawDBType = true;
    this.formatDBType = function () {
        return data.map(d=>'(' + pgp.as.format(template, d) + ')').join(',');
    };
}

使用它的示例,与您的情况完全相同:

var users = [['John', 23], ['Mike', 30], ['David', 18]];

db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('$1, $2', users))
    .then(data=> {
        // OK, all records have been inserted
    })
    .catch(error=> {
        // Error, no records inserted
    });

它也适用于对象数组:

var users = [{name: 'John', age: 23}, {name: 'Mike', age: 30}, {name: 'David', age: 18}];

db.none('INSERT INTO Users(name, age) VALUES $1', Inserts('${name}, ${age}', users))
    .then(data=> {
        // OK, all records have been inserted
    })
    .catch(error=> {
        // Error, no records inserted
    });

更新-1

INSERT有关通过单个查询的高性能方法,请参阅使用 pg-promise 的多行插入

更新-2

这里的信息现在已经很老了,请参阅Custom Type Formatting的最新语法。原来是_rawDBType现在rawTypeformatDBType改名了toPostgres

于 2016-01-26T13:53:27.497 回答
0

您将不得不动态生成查询。虽然有可能,但这是有风险的,如果你做错了,很容易导致 SQL 注入漏洞。在查询中的参数索引和传入的参数之间也很容易出现错误。

话虽如此,下面是一个示例,说明如何编写此代码,假设您有一组用户,如下所示{name: string, email: string}

client.query(
  `INSERT INTO table_name (name, email) VALUES ${users.map(() => `(?, ?)`).join(',')}`,
  users.reduce((params, u) => params.concat([u.name, u.email]), []),
  callBack,
)

另一种方法是使用像@databases/pg(我写的)这样的库:

await db.query(sql`
  INSERT INTO table_name (name, email)
  VALUES ${sql.join(users.map(u => sql`(${u.name}, ${u.email})`), ',')}
`)

@databases 要求对查询进行标记,sql并使用它来确保您传递的任何用户数据始终自动转义。这也让您可以内联编写参数,我认为这使代码更具可读性。

于 2020-12-18T18:34:20.400 回答
-4
client.query("insert into tableName (name, email) values ($1, $2),($3, $4) ", ['john', 'john@gmail.com','john', 'john@gmail.com'], callBack)

没有帮助吗?此外,您可以手动生成用于查询的字符串:

insert into tableName (name, email) values (" +var1 + "," + var2 + "),(" +var3 + ", " +var4+ ") "

如果您在这里阅读https://github.com/brianc/node-postgres/issues/530,您可以看到相同的实现。

于 2016-01-25T10:27:31.817 回答