sequelize.query 原始查询

卧疾丰暇豫,翰墨时间作。这篇文章主要讲述sequelize.query 原始查询相关的知识,希望能为你提供帮助。


由于在很多情况下执行原始/已经准备好的SQL查询更加容易,因此可以使用该??sequelize.query??方法。
默认情况下,该函数将返回两个参数-一个结果数组和一个包含元数据的对象(例如,受影响的行数等)。请注意,由于这是原始查询,因此元数据特定于方言。一些方言将元数据“返回”到结果对象内(作为数组的属性)。但是,将始终返回两个参数,但对于MSSQL和mysql,它将是对同一对象的两个引用。

const [results, metadata] = await sequelize.query("UPDATE users SET y = 42 WHERE x = 12");
// Results will be an empty array and metadata will contain the number of affected rows.

在不需要访问元数据的情况下,可以传入查询类型以告诉序列化如何格式化结果。例如,对于一个简单的选择查询,您可以执行以下操作:
constQueryTypes= require(sequelize);
const users = await sequelize.query("SELECT * FROM `users`",type: QueryTypes.SELECT );
// We didnt need to destructure the result here - the results were returned directly

还有其他几种查询类型。??查阅源代码以获取详细信息??。
第二种选择是模型。如果您传递模型,则返回的数据将是该模型的实例。
// Callee is the model definition. This allows you to easily map a query to a predefined model
const projects = await sequelize.query(SELECT * FROM projects,
model: Projects,
mapToModel: true // pass true here if you have any mapped fields
);
// Each element of `projects` is now an instance of Project

请参阅??查询API参考??中的更多选项。一些例子:
constQueryTypes= require(sequelize);
await sequelize.query(SELECT 1,
// A function (or false) for logging your queries
// Will get called for every SQL query that gets sent
// to the server.
logging: console.log,

// If plain is true, then sequelize will only return the first
// record of the result set. In case of false it will return all records.
plain: false,

// Set this to true if you dont have a model definition for your query.
raw: false,

// The type of query you are executing. The query type affects how results are formatted before they are passed back.
type: QueryTypes.SELECT
);

// Note the second argument being null!
// Even if we declared a callee here, the raw: true would
// supersede and return a raw object.
console.log(await sequelize.query(SELECT * FROM projects,raw: true ));

“点分”属性和??nest??选项如果表的属性名称包含点,则通过设置??nest: true???选项,结果对象可以成为嵌套对象。这是通过使用??dottie.js??来实现的。见下文:
  • 没有??nest: true??:
constQueryTypes= require(sequelize);
const records = await sequelize.query(select 1 as `foo.bar.baz`,
type: QueryTypes.SELECT
);
console.log(JSON.stringify(records[0], null, 2));


"foo.bar.baz": 1

  • 与??nest: true??:
constQueryTypes= require(sequelize);
const records = await sequelize.query(select 1 as `foo.bar.baz`,
nest: true,
type: QueryTypes.SELECT
);
console.log(JSON.stringify(records[0], null, 2));


"foo":
"bar":
"baz": 1



替代品查询中的替换可以通过两种不同的方式来完成,或者使用命名参数(以开头??:???),也可以使用以表示的未命名参数?????。替换项在options对象中传递。
  • 如果传递了数组,?????则将按照它们在数组中出现的顺序进行替换
  • 如果传递了一个对象,??:key??则将替换为该对象中的键。如果对象包含在查询中找不到的键,反之亦然,则将引发异常。
constQueryTypes= require(sequelize);

await sequelize.query(
SELECT * FROM projects WHERE status = ?,

replacements: [active],
type: QueryTypes.SELECT

);

await sequelize.query(
SELECT * FROM projects WHERE status = :status,

replacements:status: active ,
type: QueryTypes.SELECT

);

数组替换将被自动处理,以下查询将搜索状态与值数组匹配的项目。
constQueryTypes= require(sequelize);

await sequelize.query(
SELECT * FROM projects WHERE status IN(:status),

replacements:status: [active, inactive] ,
type: QueryTypes.SELECT

);

要使用通配符运算符??%??,请将其附加到您的替代字符中。以下查询将用户名称以“ ben”开头的用户进行匹配。
constQueryTypes= require(sequelize);

await sequelize.query(
SELECT * FROM users WHERE name LIKE :search_name,

replacements:search_name: ben% ,
type: QueryTypes.SELECT

);

绑定参数绑定参数就像替换。在查询发送到数据库之前,通过替换将替换内容转义并插入到查询中,而将绑定参数发送到SQL查询文本之外的数据库中,则将绑定参数发送到数据库中。查询可以具有绑定参数或替换参数。绑定参数由$ 1,$ 2,...(数字)或$ key(字母数字)引用。这与方言无关。
  • 如果传递了数组,??$1???则绑定到数组(??bind[0]??)中的第一个元素
  • 如果传递了一个对象,??$key???则绑定到??object[key]???。每个键必须以非数字字符开头。??$1???不是有效的密钥,即使??object[1]??存在也是如此。
  • 无论哪种情况,??$$???都可以用来转义文字??$??符号。
数组或对象必须包含所有绑定值,否则Sequelize将引发异常。这甚至适用于数据库可能忽略绑定参数的情况。
【sequelize.query 原始查询】数据库可能对此增加了更多限制。绑定参数不能是SQL关键字,也不能是表名或列名。在带引号的文本或数据中也将忽略它们。在PostgreSQL中,如果无法从context推断出类型,可能还需要对它们进行类型转换??$1::varchar??。
constQueryTypes= require(sequelize);

await sequelize.query(
SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $1,

bind: [active],
type: QueryTypes.SELECT

);

await sequelize.query(
SELECT *, "text with literal $$1 and literal $$status" as t FROM projects WHERE status = $status,

bind:status: active ,
type: QueryTypes.SELECT

);


    推荐阅读