2017-01-05 2 views
1

Мне нужно вставить/обновить тип столбчатого столбца в базе данных postgres.Вставить POINT в базу данных postgres

Я использую node-postgres

Сценарий создан с помощью POSTGRES панели администратора показывает запрос на обновление, как

UPDATE public.places SET id=?, user_id=?, business_name=?, alternate_name=?, primary_category=?, categories=?, description=?, address=?, city=?, state=?, country=?, zip=?, point WHERE <condition>;

Как достичь точки от широты и долготы?

Я видел пару ответов, используя POSTGIS, но не смог заставить их работать.

В документации POSTGRES (https://www.postgresql.org/docs/9.2/static/xfunc-sql.html) упоминается, что мы можем использовать point '(2,1)', но это не работает с запросом pg.

Что я сейчас:

var config = { 
    user: 'postgres', 
    database: 'PGDATABASE', 
    password: 'PGPASSWORD!', 
    host: 'localhost', 
    port: 5432, 
    max: 10, 
    idleTimeoutMillis: 30000 
}; 

И обновление части:

app.post('/updatePlaces', function(req, res, next) { 
    console.log("Update"); 
    console.log(req.body.places); 
    pool.query('UPDATE places SET address = $1, alternate_name = $2, business_name = $3, categories = $4, city = $5, country = $6, description = $7, point = $8, primary_category = $9, state = $10, zip = $11', [req.body.places.address, req.body.places.alternate_name, req.body.places.business_name, req.body.places.categories, req.body.places.city, req.body.places.country, req.body.places.description, (req.body.places.point.x, req.body.places.point.y), req.body.places.primary_category, req.body.places.state, req.body.places.zip], function(err, result) { 
     if(err) { 
      console.log(err); 
      return err; 
     } 

     res.send(result.rows[0]); 
    }); 
}); 

Пробовал много различных способов для прохождения точки:

  1. (req.body.places.point .x, req.body.places.point.y)
  2. пункт (req.body.places.point.x, req.bod y.places.point.y)
  3. точка '(2,1)'

Все вышеизложенное бросает ошибку. Нужно ли использовать POSTGIS?

+0

Это можно сделать автоматически при использовании [pg-prom] (https://github.com/vitaly-t/pg-promise). Если вам интересно, я добавлю ответ с примерами;) –

+0

Да, пожалуйста @ vitaly-t –

ответ

2

После нескольких комбинаций выяснилось, что это работает. !!

('(' + req.body.places.point.x + ',' + req.body.places.point.y +')')

проводок в ответ, если кто-то пытается сделать это только с помощью node-postgres.

Таким образом, вы можете использовать одинарные кавычки пунктов: insert into x values ('(1,2)');

insert into x values (point(1,2)); Но использование в запросе не работает.

1

Это работает, если вы пишете SQL "непосредственно":

CREATE TEMP TABLE x(p point) ; 
INSERT INTO x VALUES ('(1,2)'); 
INSERT INTO x VALUES (point(3, 4)); 
SELECT * FROM x ; 

Результаты

(1,2) 
(3,4) 
1

Если вы используете pg-promise, то пользовательские типы могут быть отформатированы автоматически, см Custom Type Formatting.

Вы можете ввести свой собственный тип, как это:

function Point(x, y) { 
    this.x = x; 
    this.y = y; 

    // Custom Type Formatting: 
    this._rawDBType = true; // to make the type return the string without escaping it; 

    this.formatDBType = function() { 
     return 'ST_MakePoint(' + this.x + ',' + this.y + ')'; 
    }; 
} 

В какой-то момент вы можете создать свои объекты:

var p = new Point(11, 22); 

И тогда вы можете использовать такие переменные, как обычные типы:

db.query('INSERT INTO places(place) VALUES(ST_SetSRID($1, 4326))', [p]); 

См. Также: Geometry Constructors.

+0

Спасибо @ vitaly-t У меня есть еще один вопрос: моя база данных больше ориентирована на местоположение, следует ли использовать postGIS? –

+1

Да, это, как правило, хорошая идея, поскольку PostGIS в наши дни является родным компонентом для PostgreSQL, предоставляя все интеллектуальные поисковые запросы, которые нужны для поиска по местоположению;) –

+0

Cool. Спасибо. :) –

Смежные вопросы