什么是 ORM?
简单的讲就是对 SQL 查询语句的封装,让我们可以用 OOP 的方式操作数据库,优雅的生成安全、可维护的 SQL 代码。直观上,是一种 Model 和 SQL 的映射关系。
sequelize.query(原始查询)
默认情况下,函数将返回两个参数 – 一个结果数组,以及一个包含元数据(受影响的行等)的对象。请注意,由于这是一个原始查询,所以元数据(属性名称等)是具体的方言。某些方言返回元数据 “within” 结果对象(作为数组上的属性)。但是,将永远返回两个参数,但对于 MSSQL 和 MySQL,它将是对同一对象的两个引用。
const result1 = await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’);
// 返回值是两个相同元素组成的数组
“result1”: [
[
{
“id”: 1,
“url”: “/ClassDetail?id=4”
},
{
“id”: 4,
“url”: “/ClassDetail?id=2”
}
],
[
{
“id”: 1,
“url”: “/ClassDetail?id=4”
},
{
“id”: 4,
“url”: “/ClassDetail?id=2”
}
]
]
解决办法有两种
传递一个查询类型来告诉后续如何格式化结果
const result= await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’, {
replacements: {},
type: mysql.QueryTypes.SELECT
});
传递模型
const Carousel = require(‘../../models/Carousel’);
const result2 = await mysql.query(‘SELECT id, img_url, url from carousel where status = 1’,{ model: Carousel});
替换
查询中的替换可以通过两种不同的方式完成:使用命名参数(以:开头),或者由?表示的未命名参数。替换在 options 对象中传递。
?
如果传递一个数组, ? 将按照它们在数组中出现的顺序被替换
const banner2 = await mysql.query(‘SELECT id, img_url, url from carousel where id = ?’, {
replacements: [1,4,5,6],
type: mysql.QueryTypes.SELECT,
});
// 返回的结果只有数组第一个元素下标对应的数据
:
const banner3 = await mysql.query(‘SELECT id, img_url, url from carousel where id in (:[1,4,5,6])’, {
replacements: {[1,4,5,6]},
type: mysql.QueryTypes.SELECT,
});
// 返回结果为符合数组的数据
// 拓展:模糊查询
sequelize.query(‘SELECT * FROM users WHERE name LIKE :search_name ‘,
{replacements: { search_name: ‘ben%’}, type: sequelize.QueryTypes.SELECT }
).then(projects => {
console.log(projects)
})
参考文档:Sequelize 中文文档 v4 – Raw queries – 原始查询