翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
AWS AppSync RDS 関数とリゾルバーにより、デベロッパーは SQL は、 RDS データを使用して Amazon Aurora クラスターデータベースにクエリAPIを実行し、これらのクエリの結果を返します。書き込むことができます。SQL AWS AppSyncのrds
モジュールsql
タグ付きテンプレートAPIを使用するか、rds
モジュールの select
、insert
、update
、remove
ヘルパー関数を使用してデータに送信される ステートメント。 はRDS、Data Service の ExecuteStatement
アクション AWS AppSync を使用して、データベースに対して SQLステートメントを実行します。
SQL タグ付きテンプレート
AWS AppSyncのsql
タグ付けされたテンプレートを使用すると、テンプレート expressions を使用して実行時に動的値を受信できる静的ステートメントを作成できます。 は、式値から変数マップ AWS AppSync を構築して、Amazon Aurora Serverless Data に送信されるSqlParameterized
クエリを構築しますAPI。この方法では、実行時に渡される動的な値によって元のステートメントを変更することができないため、意図しない実行が発生する可能性があります。動的な値はすべてパラメータとして渡され、元のステートメントを変更することはできず、データベースによって実行されることもありません。これにより、クエリの脆弱性が軽減されます。SQL インジェクション攻撃。
注記
いずれの場合も、書き込み時に SQL ステートメントでは、セキュリティガイドラインに従って、入力として受信したデータを適切に処理する必要があります。
注記
sql
タグ付きテンプレートは変数値の受け渡しのみをサポートします。式を使用して列名やテーブル名を動的に指定することはできません。ただし、ユーティリティ関数を使用して動的ステートメントを作成することはできます。
次の例では、実行時に GraphQL クエリで動的に設定される col
引数の値に基づいてフィルタリングするクエリを作成します。この値は、タグ式を使用してのみステートメントに追加できます。
import { sql, createMySQLStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const query = sql`
SELECT * FROM table
WHERE column = ${ctx.args.col}`
;
return createMySQLStatement(query);
}
すべての動的な値を変数マップに渡すことで、データベースエンジンに依存して値を安全に処理し、サニタイズします。
ステートメントの作成
関数とリゾルバーは、MySQL データベースと PostgreSQL データベースとやり取りできます。createMySQLStatement
と createPgStatement
をそれぞれ使用してステートメントを作成します。例えば、 createMySQLStatement
は MySQL クエリを作成できます。これらの関数は最大 2 つのステートメントを受け付けるので、リクエストですぐに結果を取得する必要がある場合に便利です。My を使用するとSQL、次のことができます。
import { sql, createMySQLStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { id, text } = ctx.args;
const s1 = sql`insert into Post(id, text) values(${id}, ${text})`;
const s2 = sql`select * from Post where id = ${id}`;
return createMySQLStatement(s1, s2);
}
注記
createPgStatement
および createMySQLStatement
は、sql
タグ付きテンプレートで作成されたステートメントをエスケープしたり、引用したりすることはありません。
データの取得
実行されたSQLステートメントの結果は、 context.result
オブジェクトのレスポンスハンドラーで使用できます。結果は、 ExecuteStatement
アクションのレスポンス要素を含むJSON文字列です。解析された結果は次のとおりです。
type SQLStatementResults = {
sqlStatementResults: {
records: any[];
columnMetadata: any[];
numberOfRecordsUpdated: number;
generatedFields?: any[]
}[]
}
toJsonObject
ユーティリティを使用して、返された行を表すJSONオブジェクトのリストに結果を変換できます。例:
import { toJsonObject } from '@aws-appsync/utils/rds';
export function response(ctx) {
const { error, result } = ctx;
if (error) {
return util.appendError(
error.message,
error.type,
result
)
}
return toJsonObject(result)[1][0]
}
toJsonObject
はステートメントの結果の配列を返すことに注意してください。1 つのステートメントを指定した場合、配列の長さは 1
です。2 つのステートメントを指定した場合、配列の長さは 2
です。配列内の各結果には、0
以上の行が含まれます。結果の値が無効な場合や予期しないものである場合、toJsonObject
は null
を返します。
ユーティリティ関数
モジュールのユーティリティヘルパーを使用して AWS AppSync RDS、データベースとやり取りできます。
select
ユーティリティは、リレーショナルデータベースにクエリを実行する SELECT
ステートメントを作成します。
基本的な使用法
基本的な形式では、クエリを実行するテーブルを指定できます。
import { select, createPgStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
// Generates statement:
// "SELECT * FROM "persons"
return createPgStatement(select({table: 'persons'}));
}
なお、テーブル識別子でスキーマを指定することもできます。
import { select, createPgStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
// Generates statement:
// SELECT * FROM "private"."persons"
return createPgStatement(select({table: 'private.persons'}));
}
列の指定
columns
プロパティで列を指定できます。これを値に設定しない場合、デフォルトでは *
になります。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name']
}));
}
また、列のテーブルも指定できます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "persons"."name"
// FROM "persons"
return createPgStatement(select({
table: 'persons',
columns: ['id', 'persons.name']
}));
}
LIMIT と OFFSET
limit
と offset
をクエリに適用できます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
// LIMIT :limit
// OFFSET :offset
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
limit: 10,
offset: 40
}));
}
ORDER BY
結果は orderBy
プロパティを使用してソートできます。列とオプションの dir
プロパティを指定するオブジェクトの配列を指定します。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name" FROM "persons"
// ORDER BY "name", "id" DESC
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
orderBy: [{column: 'name'}, {column: 'id', dir: 'DESC'}]
}));
}
フィルター
特殊条件オブジェクトを使用してフィルターを構築できます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
// WHERE "name" = :NAME
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
where: {name: {eq: 'Stephane'}}
}));
}
以下のフィルターを組み合わせることもできます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
// WHERE "name" = :NAME and "id" > :ID
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
where: {name: {eq: 'Stephane'}, id: {gt: 10}}
}));
}
また、OR
ステートメントも作成できます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
// WHERE "name" = :NAME OR "id" > :ID
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
where: { or: [
{ name: { eq: 'Stephane'} },
{ id: { gt: 10 } }
]}
}));
}
not
を使用して条件を無効にすることもできます。
export function request(ctx) {
// Generates statement:
// SELECT "id", "name"
// FROM "persons"
// WHERE NOT ("name" = :NAME AND "id" > :ID)
return createPgStatement(select({
table: 'persons',
columns: ['id', 'name'],
where: { not: [
{ name: { eq: 'Stephane'} },
{ id: { gt: 10 } }
]}
}));
}
以下の演算子を使用して、値を比較することもできます。
演算子 | 説明 | 可能な値型 |
---|---|---|
eq | Equal | 数値、文字列、ブール値 |
ne | Not equal | 数値、文字列、ブール値 |
le | Less than or equal | 番号、文字列 |
lt | Less than | 番号、文字列 |
ge | Greater than or equal | 番号、文字列 |
gt | Greater than | 番号、文字列 |
contains | いいね | string |
notContains | 好きではない | string |
beginsWith | プレフィックスで始まる | string |
次の間 | 2 つの値の間 | 番号、文字列 |
attributeExists | 属性が null ではありません | 数値、文字列、ブール値 |
size | 要素の長さを確認します | string |
insert
ユーティリティによって、INSERT
オペレーションを使用してデータベースに単一行の項目を簡単に挿入できます。
単一項目の挿入
項目を挿入するには、テーブルを指定して、値のオブジェクトを渡します。オブジェクトキーはテーブルの列にマッピングされます。列名は自動的にエスケープされ、値は変数マップを使用してデータベースに送信されます。
import { insert, createMySQLStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { input: values } = ctx.args;
const insertStatement = insert({ table: 'persons', values });
// Generates statement:
// INSERT INTO `persons`(`name`)
// VALUES(:NAME)
return createMySQLStatement(insertStatement)
}
SQLユースケース
insert
の後に select
を組み合わせて、挿入した行を取得できます。
import { insert, select, createMySQLStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { input: values } = ctx.args;
const insertStatement = insert({ table: 'persons', values });
const selectStatement = select({
table: 'persons',
columns: '*',
where: { id: { eq: values.id } },
limit: 1,
});
// Generates statement:
// INSERT INTO `persons`(`name`)
// VALUES(:NAME)
// and
// SELECT *
// FROM `persons`
// WHERE `id` = :ID
return createMySQLStatement(insertStatement, selectStatement)
}
Postgres のユースケース
Postgres では、returning
*
または列名の配列が受け入れられます。
import { insert, createPgStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { input: values } = ctx.args;
const insertStatement = insert({
table: 'persons',
values,
returning: '*'
});
// Generates statement:
// INSERT INTO "persons"("name")
// VALUES(:NAME)
// RETURNING *
return createPgStatement(insertStatement)
}
update
ユーティリティでは、既存の行を更新できます。条件オブジェクトを使用すると、条件を満たすすべての行の指定された列に変更を適用できます。例えば、このミューテーションを可能にするスキーマがあるとします。Person
の name
を 3
の id
値で更新したいのですが、これは 2000
年以降にそれら (known_since
) がわかっている場合に限ります。
mutation Update {
updatePerson(
input: {id: 3, name: "Jon"},
condition: {known_since: {ge: "2000"}}
) {
id
name
}
}
更新リゾルバーは以下のようになります。
import { update, createPgStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { input: { id, ...values }, condition } = ctx.args;
const where = {
...condition,
id: { eq: id },
};
const updateStatement = update({
table: 'persons',
values,
where,
returning: ['id', 'name'],
});
// Generates statement:
// UPDATE "persons"
// SET "name" = :NAME, "birthday" = :BDAY, "country" = :COUNTRY
// WHERE "id" = :ID
// RETURNING "id", "name"
return createPgStatement(updateStatement)
}
条件にチェックを追加して、3
と等しいプライマリキー id
を持つ行だけが更新されるようにすることができます。同様に、Postgres inserts
の場合も、returning
を使用して変更されたデータを返すことができます。
remove
ユーティリティでは、既存の行を削除できます。条件オブジェクトは、条件を満たすすべての行で使用できます。delete
は の予約キーワードです JavaScript。 は代わりに使用remove
する必要があります。
import { remove, createPgStatement } from '@aws-appsync/utils/rds';
export function request(ctx) {
const { input: { id }, condition } = ctx.args;
const where = { ...condition, id: { eq: id } };
const deleteStatement = remove({
table: 'persons',
where,
returning: ['id', 'name'],
});
// Generates statement:
// DELETE "persons"
// WHERE "id" = :ID
// RETURNING "id", "name"
return createPgStatement(updateStatement)
}
キャスティング
ステートメントで使用する正しいオブジェクト型に関して、さらに特異度が必要となる場合もあるでしょう。指定されたタイプのヒントを使用してパラメータのタイプを指定できます。 は、データ と同じタイプのヒント AWS AppSync をサポートしますAPI。モジュールの typeHint
関数を使用してパラメータを AWS AppSync rds
キャストできます。
次の例では、JSONオブジェクトとしてキャストされる値として配列を送信できます。->
演算子を使用して、index
2
JSON配列内の で 要素を取得します。
import { sql, createPgStatement, toJsonObject, typeHint } from '@aws-appsync/utils/rds';
export function request(ctx) {
const arr = ctx.args.list_of_ids
const statement = sql`select ${typeHint.JSON(arr)}->2 as value`
return createPgStatement(statement)
}
export function response(ctx) {
return toJsonObject(ctx.result)[0][0].value
}
キャスティングは、DATE
、TIME
、TIMESTAMP
の処理や比較を行うときにも役立ちます。
import { select, createPgStatement, typeHint } from '@aws-appsync/utils/rds';
export function request(ctx) {
const when = ctx.args.when
const statement = select({
table: 'persons',
where: { createdAt : { gt: typeHint.DATETIME(when) } }
})
return createPgStatement(statement)
}
現在の日付と時刻を送信する方法について別の例を以下に示します。
import { sql, createPgStatement, typeHint } from '@aws-appsync/utils/rds';
export function request(ctx) {
const now = util.time.nowFormatted('YYYY-MM-dd HH:mm:ss')
return createPgStatement(sql`select ${typeHint.TIMESTAMP(now)}`)
}
使用可能な型ヒント
-
typeHint.DATE
- 対応するパラメータが、DATE
型のオブジェクトとしてデータベースに送信されます。受け入れられる形式はYYYY-MM-DD
です。 -
typeHint.DECIMAL
- 対応するパラメータが、DECIMAL
型のオブジェクトとしてデータベースに送信されます。 -
typeHint.JSON
- 対応するパラメータが、JSON
型のオブジェクトとしてデータベースに送信されます。 -
typeHint.TIME
- 対応する文字列パラメータ値が、TIME
型のオブジェクトとしてデータベースに送信されます。受け入れられる形式はHH:MM:SS[.FFF]
です。 -
typeHint.TIMESTAMP
- 対応する文字列パラメータ値が、TIMESTAMP
型のオブジェクトとしてデータベースに送信されます。受け入れられる形式はYYYY-MM-DD HH:MM:SS[.FFF]
です。 -
typeHint.UUID
- 対応する文字列パラメータ値が、UUID
型のオブジェクトとしてデータベースに送信されます。