我有一个使用MariaDB的node.js应用程序。 到目前为止,我的所有SQL都存储在存储过程中。
我正在考虑Sequelize,我在那里找不到的唯一东西 - 我需要 - 在where子句中使用函数。
我在当前的查询中有类似的内容:
Select * from places p
where ST_WITHIN(p.geolocation, ST_BUFFER(GeomFromText(in_geolocation), radius)) = 1
(in_gelocation和radius是SP参数)。
有没有在Sequelize或其他ORM中这样做?
由于
答案 0 :(得分:2)
尝试使用Sequelize.fn
:
创建表示数据库函数的对象。这可以用于 搜索查询,包括其中和订单部分,以及默认值 在列定义中。
http://docs.sequelizejs.com/en/latest/api/sequelize/#fn-fn-args-sequelizefn
答案 1 :(得分:0)
这是一个Sequelize地理位置示例,供您参考。它利用SQL函数并说明了where属性的包含。
if(!query.includes(',') && lat && lng) {
attributes.push([
DataTypes.fn('concat',
DataTypes.col('city'),
DataTypes.col('state')
),'city_state'])
attributes.push([
DataTypes.fn('ST_Distance',
DataTypes.col('location'),
DataTypes.literal(`ST_GeomFromText('POINT(${lat} ${lng})', 4326)`)
), 'distance'])
}
if(!query.includes(',')) {
attributes.push([DataTypes.literal(`CASE
WHEN
name = '` + query + `' THEN 4
WHEN
city LIKE '%` + query + `%' THEN 3
WHEN
name LIKE '%` + query + `%' THEN 2
WHEN
name LIKE '` + query + `%' THEN 1
END`), 'exact_like_match'])
}
var whereAnd = []
whereAnd.push(
DataTypes.literal('MATCH(name, city, state, zip) AGAINST(:search_query)')
)
whereAnd.push({
menu_enabled: 'Y'
})
var search_params = {
where: whereAnd,
replacements: {
search_query: '+' + query + '*',
type: DataTypes.QueryTypes.SELECT
},
attributes: attributes,
offset: parseInt(req.query.start),
limit: req.query.limit ? parseInt(req.query.limit) : 12
}
search_params['order'] = [
DataTypes.literal('exact_like_match DESC')
]
if(!query.includes(',')) {
// console.log('comma detected!')
search_params['order'] = [
DataTypes.literal('exact_like_match DESC, distance ASC')
]
}
dispensary.findAndCountAll(search_params).then(disp_rx => {
})