9

前の例を使用しますか?
テーブルの列ヘッダーに手動で名前を付けずに、JSONオブジェクトを使用してmysqlテーブルを挿入/更新するにはどうすればよいですか?そして、それが非同期であることを保証します。

var mysql = require('node-mysql');
var conn = mysql.createConnection({
    ...
});


var values = [
    {name:'demian', email: 'demian@gmail.com', ID: 1},
    {name:'john'  , email: 'john@gmail.com'  , ID: 2},
    {name:'mark'  , email: 'mark@gmail.com'  , ID: 3},
    {name:'pete ' , email: 'pete@gmail.com'  , ID: 4}
];

// var sql = "INSERT INTO Test (name, email, n) VALUES ?";


   conn.query(sql, [values], function(err) {
        if (err) throw err;
        conn.end();
    })
4

4 に答える 4

6

あなたはこのようなことをすることができます:

for(var i = 0; i < values.length; i++){
    var post  = values[i]
    var query = connection.query('INSERT INTO posts SET ?', post, function(err, result) {
         // Finish
    });
}

編集

これは、一度に複数の「投稿」を挿入する方法です。

INSERT INTO posts (type, details)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),

このような名前を取得するには、最初の値をループする必要があります。

var names = [];
for(name in values[0]){
names.push(name);
// That would give you name, email, id
}

次に、挿入する独自の文字列を作成する必要があります。

var newvalues = [];
for(var i = 0; i < values.length; i++){
    newvalues.push('(' + values[i].join(',') + ')');
}

次に、クエリを実行します。

connection.query('INSERT INTO posts (' + names.join(',') + ') VALUES ' + newvalues.join(',') , function(err, rows, fields) {
  // Result
});

あなたは自分でコードをテストしなければならないでしょう、これはあなたがそれをする方法です。

于 2013-03-12T21:34:16.930 に答える
2

ここで「カスタムフォーマット」の部分を見てください。お気づきの方もいらっしゃると思いますが、この例ではクエリで名前付きプレースホルダーを使用してオブジェクトを渡すことができ、プレースホルダーはオブジェクトの一致する属性に置き換えられています。わかりやすくするために、関連するセクションも貼り付けました。

connection.config.queryFormat = function (query, values) {
  if (!values) return query;
  return query.replace(/\:(\w+)/g, function (txt, key) {
    if (values.hasOwnProperty(key)) {
      return this.escape(values[key]);
    }
    return txt;
  }.bind(this));
};

connection.query("UPDATE posts SET title = :title", { title: "Hello MySQL" });
于 2013-03-12T17:46:48.960 に答える
0

その形式の配列を挿入ステートメントにマップする小さな関数を作成できます。

フィールドを簡単にループして、文字列連結を使用できます。

于 2013-03-12T17:04:56.690 に答える