使用 knex-postgis 进行动态查询
Dynamic queries with knex-postgis
我正在构建一个简单的 API,它也处理几何(存储到 postGIS 中)。
我正在使用 knex-postgis 通过 knex 访问 postGIS 中的 ST_ 空间函数。
我用这个例子插入了一个点,它在硬编码时有效。
但是我缺乏经验让我悬而未决,我怎样才能使查询动态化?我想创建一个带有 x 和 y 值输入的表单,并将其发送到 ST_geomFromText 函数以将其保存到数据库中的 geom 类型。
这是您使用参数的时候吗?有人能给我指出正确的方向吗?
// insert a point
const sql1 = db.insert({
id: 1,
geom: st.geomFromText('Point(0 0)', 4326)
}).into('points').toString();
console.log(sql1);
// insert into "points" ("geom", "id") values
(ST_geomFromText('Point(0 0)'), '1')
到目前为止我已经试过了
router.post('/', (req, res, next) => {
queries.create(req.body).then(poi => {
res.json(poi[0]);
});
});
插入查询
create(poi) {
const sql = db.insert(poi).returning('*').into('poi');
return sql;
},
在 Postman 中,我将其发送到正文中
{
"place": "test",
"comments": "new",
"numbers": 6,
"geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"
}
但是报错"Unhandled rejection error: parse error - invalid geometry"
硬编码对象看起来一样并且工作正常。
我感觉我使用的 st.geomFromText 有误,但我不确定?
如果我 console.log 返回查询
,这就是我得到的结果
insert into "poi" ("comments", "geom", "numbers", "place") values ('new', 'st.geomFromText(''Point(-71.064544 44.28787)'', 4326)', 6, 'test')
(看怎么没把st.geom..改成st_geom..?还有ST函数和Point对象两边的引号不对)
当我在 pgAdmin运行 中
时,这个字符串有效
insert into "poi" ("comments", "geom", "numbers", "place") values ('new', st_GeomFromText('Point(-71.064544 44.28787)', 4326), 6, 'test')
编辑:
我也 console.log 硬编码版本。它似乎没有在几何值
上添加额外的 ''
insert into "poi" ("geom") values (ST_geomFromText('Point(-71.064544 44.28787)', 4326))
有什么建议吗?
您将来自邮递员的坐标 作为字符串值传递给 JSON 对象
"geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"
并期望您的代码将其转换为 函数调用
st.geomFromText('Point(-71.064544 44.28787)', 4326)
knex
在这种情况下的作用。它需要你的 string 并将其转换为 string 字段(这里你得到一个单引号 '
替换为双 ''
对于 Postgres 为 escape it).
你能做什么。像这样
将你的几何图形传递给你的 API
"geom": "Point(-71.064544 44.28787)"
并在您的路由处理程序中
create(poi) {
const sql = db.insert({
place: poi.place,
comments: poi.comments,
numbers: poi.numbers,
geom: st.geomFromText(poi.geom, 4326)
}).returning('*').into('poi');
return sql;
},
我正在构建一个简单的 API,它也处理几何(存储到 postGIS 中)。 我正在使用 knex-postgis 通过 knex 访问 postGIS 中的 ST_ 空间函数。
我用这个例子插入了一个点,它在硬编码时有效。 但是我缺乏经验让我悬而未决,我怎样才能使查询动态化?我想创建一个带有 x 和 y 值输入的表单,并将其发送到 ST_geomFromText 函数以将其保存到数据库中的 geom 类型。 这是您使用参数的时候吗?有人能给我指出正确的方向吗?
// insert a point
const sql1 = db.insert({
id: 1,
geom: st.geomFromText('Point(0 0)', 4326)
}).into('points').toString();
console.log(sql1);
// insert into "points" ("geom", "id") values
(ST_geomFromText('Point(0 0)'), '1')
到目前为止我已经试过了
router.post('/', (req, res, next) => {
queries.create(req.body).then(poi => {
res.json(poi[0]);
});
});
插入查询
create(poi) {
const sql = db.insert(poi).returning('*').into('poi');
return sql;
},
在 Postman 中,我将其发送到正文中
{
"place": "test",
"comments": "new",
"numbers": 6,
"geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"
}
但是报错"Unhandled rejection error: parse error - invalid geometry" 硬编码对象看起来一样并且工作正常。
我感觉我使用的 st.geomFromText 有误,但我不确定?
如果我 console.log 返回查询
,这就是我得到的结果insert into "poi" ("comments", "geom", "numbers", "place") values ('new', 'st.geomFromText(''Point(-71.064544 44.28787)'', 4326)', 6, 'test')
(看怎么没把st.geom..改成st_geom..?还有ST函数和Point对象两边的引号不对)
当我在 pgAdmin运行 中
时,这个字符串有效insert into "poi" ("comments", "geom", "numbers", "place") values ('new', st_GeomFromText('Point(-71.064544 44.28787)', 4326), 6, 'test')
编辑: 我也 console.log 硬编码版本。它似乎没有在几何值
上添加额外的 ''insert into "poi" ("geom") values (ST_geomFromText('Point(-71.064544 44.28787)', 4326))
有什么建议吗?
您将来自邮递员的坐标 作为字符串值传递给 JSON 对象
"geom": "st.geomFromText('Point(-71.064544 44.28787)', 4326)"
并期望您的代码将其转换为 函数调用
st.geomFromText('Point(-71.064544 44.28787)', 4326)
knex
在这种情况下的作用。它需要你的 string 并将其转换为 string 字段(这里你得到一个单引号 '
替换为双 ''
对于 Postgres 为 escape it).
你能做什么。像这样
将你的几何图形传递给你的 API"geom": "Point(-71.064544 44.28787)"
并在您的路由处理程序中
create(poi) {
const sql = db.insert({
place: poi.place,
comments: poi.comments,
numbers: poi.numbers,
geom: st.geomFromText(poi.geom, 4326)
}).returning('*').into('poi');
return sql;
},