.sendNativeQuery()
使用此数据存储执行原始 SQL 查询。
var rawResult = await datastore.sendNativeQuery(sql, valuesToEscape);
.sendNativeQuery()
仅在配置为使用 SQL 数据库(例如 MySQL、SQL Server 或 PostgreSQL)的 Sails/Waterline 数据存储 上可用。请注意,不同数据库之间的确切 SQL 和结果格式可能会有所不同,因此您需要参考底层数据库适配器的文档。(请参阅以下简单示例以帮助您入门。)
参数 | 类型 | 详细信息 | |
---|---|---|---|
1 | sql | 以适合此数据库的方言编写的 SQL 字符串。允许使用模板语法,如 $1 、$2 等。(请参阅以下示例。)如果您使用的是自定义表名或列名,请确保直接引用它们(而不是模型标识和属性名称)。 |
|
2 | valuesToEscape | 要 SQL 转义并在 sql 中注入的动态、不可信字符串数组。(如果您没有要注入的动态值,则只需省略此参数或在此处传入一个空数组。) |
类型 | 详细信息 |
---|---|
来自数据库适配器的原始结果(如果有)。(此原始结果数据的确切格式因您传入的 SQL 查询以及您使用的适配器/方言而异。请参阅以下示例以获取相关文档的链接。) |
名称 | 类型 | 何时 |
---|---|---|
UsageError | 如果传入无效内容,则抛出此错误。 | |
AdapterError | 如果数据库适配器出现问题,则抛出此错误。 | |
Error | 如果发生任何其他意外情况,则抛出此错误。 |
请参阅 概念 > 模型和 ORM > 错误,了解在 Sails 和 Waterline 中处理错误的示例。
以下是一个适用于几乎所有关系数据库的通用示例。但请记住:用法和结果数据会因您发送的 SQL 查询以及您使用的适配器/方言而异。Sails 和 Waterline 的标准 MySQL 适配器 使用
mysql
NPM 包。 PostgreSQL 适配器 使用pg
.
// Build our SQL query template.
var NAMES_OF_PETS_SQL = `
SELECT pet.name
FROM pet
WHERE pet.species_label = $1 OR pet.species_label = $2`;
// Send it to the database.
var rawResult = await sails.sendNativeQuery(NAMES_OF_PETS_SQL, [ 'dog', 'cat' ]);
sails.log(rawResult);
// (result format depends on the SQL query that was passed in, and the adapter/dialect you're using)
// Then parse the raw result and do whatever you like with it.
return exits.success();
您编写的 SQL 查询应引用表名和列名,而不是模型标识和属性名称。如果您的模型使用自定义表名定义,或者它们的属性使用自定义列名定义,您需要确保在本地 SQL 查询中使用这些自定义名称。
您是否正在使用自定义表/列名,并且担心它们会分散在代码中,因为它们可能会发生变化?幸运的是,有一种方法可以解决这个问题。通过使用 Waterline 模型上可用的 tableName
和 columnName
的底层引用,您可以构建 SQL 查询模板,而无需直接引用列名和表名。
例如
var NAMES_OF_PETS_SQL = `
SELECT ${Pet.tableName}.${Pet.schema.name.columnName}
FROM ${Pet.tableName}
WHERE
${Pet.tableName}.${Pet.schema.speciesLabel.columnName} = $1
OR
${Pet.tableName}.${Pet.schema.speciesLabel.columnName} = $2
`;
请注意,您仍然需要处理输出时的自定义列名!从 .sendNativeQuery()
获取的 rawResult
本质上是特定于数据库的,并且与物理层相关联,因此它将继承您在其中设置的任何复杂性(包括来自模型定义的自定义表/列名)。