.sendNativeQuery()
使用此資料儲存區執行原始 SQL 查詢。
var rawResult = await datastore.sendNativeQuery(sql, valuesToEscape);
.sendNativeQuery()
僅適用於設定為使用 SQL 資料庫的 Sails/Waterline 資料儲存區(例如 MySQL、SQL Server 或 PostgreSQL)。請注意,確切的 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
本質上是資料庫特定的,並且與物理層綁定,因此它將繼承您在那裡設定的任何複雜性(包括來自模型定義的自訂表格/欄位名稱)。