我正在序列化一个表单并使用jQuery AJAX将数据发送到快速路径:
以arrobj
发送的对象例如:
{
col1: [ 'one', 'two', 'three' ],
col2: [ 'foo', 'bar', 'baz' ]
}
在路线中,我有一个创建参数化查询字符串的函数,如下所示:
function create_insert_SQL(obj, table, returnid) {
// Loop through OBJ and extract column names
var cols = ''; // Store column names
var params = ''; // Store Parameter references eg. $1, $2 etc
var count = 1;
for(var p in obj) {
cols += p + ",";
params += "$" + count + ",";
count++;
};
var strSQL = "INSERT INTO " + table + " (";
strSQL += cols.substr(0, cols.length - 1);
strSQL += ') VALUES (';
strSQL += params.substr(0, params.length - 1)
strSQL += ') returning ' + returnid + ' as id';
return strSQL;
}
这将返回insert into mytable (col1,col2) values ($1, $2);
创建查询字符串后,我在node-postgres中运行插入查询,传递对象:
db.query(SQL, arrobj, function (err, result) {
if (err) {
res.send(err)
} else {
res.send(result.rows[0].id.toString()) // return the inserted value
}
});
对于每个键中的单个值,一切正常,数据正确插入表中。
如何为每个键值运行插入查询?
示例:
insert into table (col1, col2) values ('one', 'foo');
insert into table (col1, col2) values ('two', 'bar');
insert into table (col1, col2) values ('three', 'baz');
答案 0 :(得分:0)
第一个也是最棘手的部分是反转你的对象结构,以便你插入行。请参阅下面的代码段并运行它以查看会发生什么。
之后,您可以迭代列(对于.. in,就像您已经拥有的那样)来获取INSERT INTO列部分,并迭代新对象的行以获取值部分。它应该很容易,如果你需要帮助,请告诉我。
var obj = {
col1: [ 'one', 'two', 'three' ],
col2: [ 'foo', 'bar', 'baz' ],
col3: [ '1', '2', '3' ]
}
//console.log(obj);
var invert = function (obj) {
var new_obj = [];
// iterate over props
for (var prop in obj) {
// iterate over columns
for(var i=0;i<obj[prop].length;i++) {
// if a row exists, assign value to it
if (new_obj[i]) {
new_obj[i][prop] = obj[prop][i];
} else {
// if it doesn't, create it
var row = {};
row[prop] = obj[prop][i];
new_obj.push(row);
}
}
}
return new_obj;
};
var bulkStatement = function (table, rows) {
var params = [];
var chunks = [];
var statement = 'INSERT INTO ' + table + '(';
for (var prop in rows[0]) {
statement += prop + ',';
}
statement = statement.slice(0,-1) + ') VALUES ';
for(var i = 0; i < rows.length; i++) {
var row = rows[i];
var valueClause = [];
for (var prop in row) {
params.push(row[prop]);
valueClause.push('$' + params.length);
}
chunks.push('(' + valueClause.join(', ') + ')');
}
return {
text: statement + chunks.join(', '),
values: params
}
};
var inverted = invert(obj);
console.log(bulkStatement('tableName', inverted));