Postgres эквивалент MySQL SET?

Я пытаюсь перейти на Postgres из INSERT INTO table_name SET name = "John Smith" , email = "jsmith@gmail.com" , website = "jsmith.org" ; и столкнулись с проблемой. У меня есть форма, где пользователь заполняет около 40 полей, и эти значения mysqled в базу данных. С MySQL я привык делать это вот так:

var data = {
  name: req.body.name,
  email: req.body.email,
  website: req.body.website,
  ...
  ...
}

var query = connection.query('INSERT INTO table_name SET ?', data)

Я также использую mysqlмодуль с nodejs, и это то, что сейчас выглядит в моем коде:

SET

Поскольку pgнедействителен SQL, если я хотел использовать Postgres, клиент . query ( 'INSERT INTO table_name (имя, адрес электронной почты, веб-сайт) VALUES ($ 1, $ 2, $ 3)' , req . body . name , req . body . email , req . body . website ) будет выглядеть так, используя модуль:var pgp = require('pg-promise')(); var db = pgp(/*connection details*/); app.get('/get', (req, res)=> { var insert = pgp.helpers.insert(req.body, null, {table: 'table_name'}); db.none(insert) .then(()=> { // success }) .catch(error=> { // error }); });

INSERT

Это оказалось бы очень утомительным, учитывая, что у меня почти 40 полей.

Есть ли лучший способ сделать это, или я придерживаюсь необходимости писать запрос вручную?

Спасибо.

javascript,mysql,sql,node.js,postgresql,

2

Ответов: 2


1 принят

Этого очень легко достичь при использовании pg-prom , и вот полный код:

var cs = new pgp.helpers.ColumnSet(['name', 'email', 'website'], {table: 'table_name'});

app.get('/get', (req, res)=> {
    var insert = pgp.helpers.insert(req.body, cs);
    db.none(insert)
        .then(()=> {
            // success
        })
        .catch(error=> {
            // error
        });
});

API: приложение . get ( '/ get' , ( req , res ) => { var insert = pgp . helpers . insert ( req . body , cs ) + 'RETURNING id' ; db . many ( insert ) . then ( data => { / / success }) . catch ( error => { // ошибка }); }); "rel =" nofollow "> helpers.insert , none

Метод helpers.insert может сгенерировать INSERTдля вас полную инструкцию, правильно отформатированную.

Это не просто самый простой подход, но он также является самым гибким, так как вам не нужно ничего менять, чтобы начать генерировать инструкции с несколькими вставками, т. Е. Если первым параметром insertметода является массив объектов, вы получите свой многопозиционный запрос.


И если вы хотите получить только определенные свойства из запроса, лучший способ - указать их отдельно, как ColumnSet вне запросов (для повторного использования, для лучшей производительности):

app.get('/get', (req, res)=> {
    var insert = pgp.helpers.insert(req.body, cs) + 'RETURNING id';
    db.map(insert, [], a=>a.id)
        .then(ids=> {
            // ids = array of id-s
        })
        .catch(error=> {
            // error
        });
});

Пример возврата массива новых идентификаторов

без преобразования

var data = {
  name: req.body.name,
  email: req.body.email,
  website: req.body.website,
  ...
  ...
}

с конверсией

pg

4

Поскольку у вас уже есть объект, содержащий соответствующие данные

query

вы можете написать функцию запроса, которая обертывает метод pgклиента queryи добавляет поддержку объектов в виде значений:

function insert(client, table, values) {
    const keys = Object.keys(values),
          // IMPORTANT: escape column identifiers. If `values` should come
          // from an uncontrolled source, naive concatenation would allow
          // SQL injection.
          columns = keys.map(k => client.escapeIdentifier(k)).join(', '),
          placeholders = keys.map((k, i) => '$' + (i + 1)).join(', ');

    return client.query(`INSERT INTO ${client.escapeIdentifier(table)} 
                         (${columns}) VALUES (${placeholders})`,
                        // According to docs `query` accepts an array of
                        // values, not values as positional arguments.
                        // If this is not true for your version, use the
                        // spread syntax (...args) to apply values.
                        keys.map(k => values[k]));
}

...

insert(client, 'table_name', data);

В качестве альтернативы вы, вероятно, можете переписать свои запросы sql-template-strings, что кажется довольно приятным.

JavaScript, MySQL, SQL, Node.js, PostgreSQL,
Похожие вопросы