请帮忙! 我有一个使用 Sequelize、postgres 和 postgis (用于 GPS)的项目。 架构(简化)是:
export default class Activity extends Model {
static init(sequelize) {
return super.init({
sequelize,
tableName: 'activities',
})
}
static get modelAttributes() {
return {
id: {
type: DataTypes.UUID,
defaultValue: DataTypes.UUIDV4,
primaryKey: true,
},
activity_name: {
type: 'citext',
allowNull: false,
unique: {
args: true,
msg: 'Activity name already in use.',
},
point: {
type: DataTypes.GEOMETRY,
allowNull: true,
},
}
}
}
我没有放置迁移文件,因为这部分效果很好:当我保存数据时,它已正确注册。
await Activity.bulkCreate({
activity_name: 'whatever,
point: { type: 'Point', coordinates: [lat, lng] },
})
当我尝试在一定距离内进行活动时,问题就出现了:
const result = await User.findAll({
include: [
{
model: Activity,
required: true,
where: {
point: Sequelize.fn(
'ST_DWithin',
Sequelize.fn(
'ST_SetSRID',
Sequelize.fn('ST_MakePoint', 40.119536, 8.495837),
4326
),
parseFloat(distance) // number 10000
),
},
},
],
})
此代码抛出错误:“函数 st_dwithin(geometry, integer) 不存在”。 我有一段时间一直在为这个问题苦苦挣扎。有什么解决办法吗? 提前谢谢!!!
当您仅将一个几何图形传递给函数时,您应该将
point
列作为 ST_DWithin
的第一个参数传递:
where: Sequelize.where(Sequelize.fn(
'ST_DWithin',
Sequelize.col('point'),
Sequelize.fn(
'ST_SetSRID',
Sequelize.fn('ST_MakePoint', 40.119536, 8.495837),
4326
),
parseFloat(distance) // number 10000
),
'=',
'true'
)