.sendNativeQuery()
このデータストアを使用して未処理の SQL クエリを実行します。
var rawResult = await datastore.sendNativeQuery(sql, valuesToEscape);
.sendNativeQuery()
は、SQL データベース(例: MySQL、SQL Server、または PostgreSQL)を使用するように設定した Sails/Waterline データストア でのみ使用できます。正確な SQL と結果の形式はデータベースによって異なるため、基盤のデータベースアダプタのドキュメントを参照する必要があります。(開始するための簡単な例を以下に示します。)
引数 | タイプ | 詳細 | |
---|---|---|---|
1 | sql | このデータベースの適切な方言で記述された SQL 文字列。$1 、$2 など、テンプレート構文を使用できます。(以下の例を参照してください。)カスタムテーブル名または列名を使用している場合は、モデル ID と属性名ではなく、それらを参照してください。 |
|
2 | valuesToEscape | SQL エスケープして sql にインジェクションする、動的かつ信頼できない文字列の配列。(インジェクションする動的値がない場合は、この引数を省略するか、空の配列を渡してください。) |
タイプ | 詳細 |
---|---|
データベースアダプタからの未処理の結果(ある場合)。(この未処理結果データの正確な形式は、渡した SQL クエリと、使用しているアダプタ/方言によって異なります。関連ドキュメントへのリンクについては、以下の例を参照してください。) |
名前 | タイプ | いつ? |
---|---|---|
UsageError | 無効なものが渡されるとスローされます。 | |
AdapterError | データベースアダプタで問題が発生した場合にスローされます。 | |
エラー | 予期しないその他の問題が発生した場合にスローされます。 |
コンセプト > モデルと ORM > エラーに、Sails と Waterline でエラーを処理する方法の例を示します。
以下に、ほとんどのリレーショナルデータベースで機能する一般的な例を示します。ただし、使用法と結果データは、送信する SQL クエリと、使用しているアダプタ/方言によって異なることに注意してください。Sails と Waterline の標準的な MySQL アダプタ (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 クエリは、モデル ID と属性名ではなく、テーブル名と列名を参照する必要があります。モデルがカスタムテーブル名で定義されている場合、またはそれらの属性がカスタム列名で定義されている場合は、ネイティブ 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
は本質的にデータベース固有であり物理レイヤーに縛られているため、モデルの定義から設定した複雑性(モデルの定義からのカスタムテーブル/列名を含む)が継承されます。
- このメソッドはSQLデータベースでのみ機能します。MongoDBなどの他のデータベースを使用している場合は、
.manager
を使用して生のMongoDBクライアントにアクセスするか、.driver
を使用して静的な基盤となるdbライブラリ(例:mysql
、pg
など)にアクセスします。- 使用しているアダプターによっては、
valuesToEscape
が変更される場合があります。これはパフォーマンス上の理由から意図的に決定されたことですが、今後のメジャーバージョンのSailsでは変更される可能性があります。今のところ、valuesToEscape
に可変を渡して、後でコードでその可変を使用する場合は、最初にそれをクローンしてください。