Node.jsのCloudSpanner libを使用して、スパナークエリにLIMIT
とORDER BY
句を動的に追加しようとしています。
function getPosts (query) {
const { limit, start, sortBy, sortOrder } = query;
delete query.start;
delete query.limit;
delete query.sortBy;
delete query.sortOrder;
const meta = {};
let limitClause = '';
let sortClause = '';
if (limit) {
limitClause = `
LIMIT @limit
OFFSET @start
`;
meta.limit = limit && parseInt(queryObj.limit, 10);
meta.start = start ? parseInt(start, 10) : 0;
}
if (sortBy) {
sortClause = `ORDER BY @sortBy ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
meta.sortBy = sortBy;
}
const [postsRows] = await myDatabase.run({
sql: `
SELECT *
FROM posts@{FORCE_INDEX=posts_userId}
WHERE userId = @userId
${sortClause}
${limitClause}
`,
params: { userId, ...meta },
});
return orderRows;
}
myDatabase
これはSpannerのインスタンスであることに注意してください。(https://cloud.google.com/nodejs/docs/reference/spanner/2.0.x/Spanner)
現時点では、LIMIT
句は期待どおりに機能しますが、応答はORDER BY
句が無視されているように見えます。
2番目のifステートメントを次のように置き換えると
if (sortBy) {
sortClause = `ORDER BY ${sortBy} ${(sortOrder && sortOrder.match(/^desc/i)) ? 'DESC' : 'ASC'}`;
}
その後、期待どおりに機能しますが、このように生の文字列をクエリに補間したくありません。
paramsがクエリにどのように補間されるかは正確にはわかりませんが、userId、limit、およびstart変数に対しては機能します。
Spannerインスタンスのrunメソッドが生成する補間の結果を確認することも役立ちますが、それを表示できるかどうか、またはどのように表示できるかはわかりません。
クエリパラメータに関するCloudSpannerのドキュメントから:
クエリパラメータは、任意の式の代わりに使用できます。ただし、識別子、列名、テーブル名、またはクエリ自体の他の部分の代わりに使用することはできません。
ORDER BY式は列名であり、サポートされているタイプのクエリパラメータではありません。この場合、クエリ文字列に補間する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加