Вставьте POINT в базу данных postgres
Мне нужно вставить / обновить тип столбца точки в базе данных 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]);
});
});
Перепробовал много разных способов прохождения точки:
- (req.body.places.point.x, req.body.places.point.y)
- точка (req.body.places.point.x, req.body.places.point.y)
- точка '(2,1)'
Все вышеперечисленное выдает ошибку. Нужно ли использовать POSTGIS?
3 ответа
После пары комбинаций, обнаружил, что это работает.!!
( '(' + 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));
в запросе не работает.
Это работает, если вы пишете 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)
Недавно я столкнулся с аналогичной проблемой, используя node-postgres
при вставке в postgis
база данных со столбцом географии (точки). Мое решение заключалось в использовании:
pool.query("INSERT INTO table (name, geography) VALUES ($1, ST_SetSRID(ST_POINT($2, $3), 4326))",
[req.body.name, req.body.lat, req.body.lng ]);
Текущие версии (Postgres 12, стр. 8) должны работать, просто используйте функцию POINT Postgres для установки значения столбца точек.
Пример:
export async function setPoint(client, x, y, id) {
const sql = `UPDATE table_name SET my_point = POINT($1,$2) WHERE id = $3 RETURNING my_point`;
const result = await client.query(sql, [x, y, id]);
return result.rows[0];
}
await setPoint(client, 10, 20, 5);
Результат:
{x: 10.0, y: 20.0}
Если вы используете pg-обещание, то пользовательские типы могут быть отформатированы автоматически, см. Форматирование пользовательских типов.
Вы можете ввести свой собственный тип, как это:
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]);
Смотрите также: Конструкторы геометрии.