Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
AWS AppSync JavaScript Resolver-Funktionsreferenz für Amazon RDS
Die AWS AppSync RDS Funktion und der Resolver ermöglichen es Entwicklern, zu senden SQL Abfragen an eine Amazon Aurora Aurora-Cluster-Datenbank unter Verwendung der RDS Daten API und Rückgabe des Ergebnisses dieser Abfragen. Sie können schreiben SQL Anweisungen, die mithilfe der mit dem rds
Modul sql
markierten Vorlage oder mithilfe AWS AppSync der remove
Hilfsfunktionenselect
, insert
update
, und des rds
Moduls an die Daten API gesendet werden. AWS AppSync verwendet die ExecuteStatement
Aktion des RDS Datendienstes, um SQL Anweisungen für die Datenbank auszuführen.
Themen
SQLmarkierte Vorlage
AWS AppSync Die sql
mit Tags versehene Vorlage ermöglicht es Ihnen, mithilfe von Vorlagenausdrücken eine statische Anweisung zu erstellen, die zur Laufzeit dynamische Werte empfangen kann. AWS AppSync erstellt eine Variablenzuordnung aus den Ausdruckswerten, um eine SqlParameterized
Abfrage zu erstellen, die an Amazon Aurora Serverless Data API gesendet wird. Mit dieser Methode ist es nicht möglich, dass dynamische Werte, die zur Laufzeit übergeben werden, die ursprüngliche Anweisung ändern, was zu einer unbeabsichtigten Ausführung führen könnte. Alle dynamischen Werte werden als Parameter übergeben, können die ursprüngliche Anweisung nicht ändern und werden nicht von der Datenbank ausgeführt. Dadurch ist Ihre Abfrage weniger anfällig für SQL Injektionsangriffe.
Anmerkung
In allen Fällen beim Schreiben SQL Bei Aussagen sollten Sie die Sicherheitsrichtlinien befolgen, um mit Daten, die Sie als Eingabe erhalten, ordnungsgemäß umzugehen.
Anmerkung
Die sql
mit Tags versehene Vorlage unterstützt nur die Übergabe von Variablenwerten. Sie können keinen Ausdruck verwenden, um die Spalten- oder Tabellennamen dynamisch anzugeben. Sie können jedoch Hilfsfunktionen verwenden, um dynamische Anweisungen zu erstellen.
Im folgenden Beispiel erstellen wir eine Abfrage, die basierend auf dem Wert des col
Arguments filtert, das zur Laufzeit dynamisch in der GraphQL-Abfrage festgelegt wird. Der Wert kann der Anweisung nur mithilfe des Tag-Ausdrucks hinzugefügt werden:
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); }
Indem wir alle dynamischen Werte über die Variablenzuordnung übergeben, verlassen wir uns darauf, dass die Datenbank-Engine Werte sicher verarbeitet und bereinigt.
Aussagen erstellen
Funktionen und Resolver können mit My SQL - und Postgre-Datenbanken interagieren. SQL Verwenden Sie createPgStatement
jeweils createMySQLStatement
und, um Anweisungen zu erstellen. createMySQLStatement
Kann beispielsweise eine Meine SQL Abfrage erstellen. Diese Funktionen akzeptieren bis zu zwei Anweisungen. Dies ist nützlich, wenn eine Anfrage sofort Ergebnisse abrufen soll. Mit My SQL könnten Sie:
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); }
Anmerkung
createPgStatement
und createMySQLStatement
umgeht oder zitiert keine Aussagen, die mit der sql
markierten Vorlage erstellt wurden.
Abrufen von Daten
Das Ergebnis Ihrer ausgeführten SQL Anweisung ist in Ihrem Antworthandler im context.result
Objekt verfügbar. Das Ergebnis ist eine JSON Zeichenfolge mit den Antwortelementen aus der ExecuteStatement
Aktion. Bei der Analyse hat das Ergebnis die folgende Form:
type SQLStatementResults = { sqlStatementResults: { records: any[]; columnMetadata: any[]; numberOfRecordsUpdated: number; generatedFields?: any[] }[] }
Sie können das toJsonObject
Tool verwenden, um das Ergebnis in eine Liste von JSON Objekten umzuwandeln, die die zurückgegebenen Zeilen darstellen. Beispielsweise:
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] }
Beachten Sie, dass ein toJsonObject
Array von Anweisungsergebnissen zurückgegeben wird. Wenn Sie eine Anweisung angegeben haben, ist die Länge des Arrays1
. Wenn Sie zwei Anweisungen angegeben haben, ist die Array-Länge2
. Jedes Ergebnis im Array enthält 0
oder mehr Zeilen. toJsonObject
gibt zurücknull
, wenn der Ergebniswert ungültig oder unerwartet ist.
Hilfsfunktionen
Sie können die Hilfsprogramme des AWS AppSync RDS Moduls verwenden, um mit Ihrer Datenbank zu interagieren.
Das select
Hilfsprogramm erstellt eine SELECT
Anweisung zur Abfrage Ihrer relationalen Datenbank.
Grundlegende Verwendung
In ihrer Grundform können Sie die Tabelle angeben, die Sie abfragen möchten:
import { select, createPgStatement } from '@aws-appsync/utils/rds'; export function request(ctx) { // Generates statement: // "SELECT * FROM "persons" return createPgStatement(select({table: 'persons'})); }
Beachten Sie, dass Sie das Schema auch in Ihrem Tabellen-Identifier angeben können:
import { select, createPgStatement } from '@aws-appsync/utils/rds'; export function request(ctx) { // Generates statement: // SELECT * FROM "private"."persons" return createPgStatement(select({table: 'private.persons'})); }
Spalten angeben
Sie können Spalten mit der columns
Eigenschaft angeben. Wenn dieser Wert nicht auf einen Wert gesetzt ist, wird standardmäßig wie folgt vorgegeben*
:
export function request(ctx) { // Generates statement: // SELECT "id", "name" // FROM "persons" return createPgStatement(select({ table: 'persons', columns: ['id', 'name'] })); }
Sie können auch die Tabelle einer Spalte angeben:
export function request(ctx) { // Generates statement: // SELECT "id", "persons"."name" // FROM "persons" return createPgStatement(select({ table: 'persons', columns: ['id', 'persons.name'] })); }
Grenzwerte und Offsets
Sie können limit
und auf offset
die Abfrage anwenden:
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 })); }
Sortiert nach
Sie können Ihre Ergebnisse nach der orderBy
Eigenschaft sortieren. Geben Sie eine Reihe von Objekten an, die die Spalte und eine optionale dir
Eigenschaft angeben:
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'}] })); }
Filter
Sie können Filter erstellen, indem Sie das Objekt mit der speziellen Bedingung verwenden:
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'}} })); }
Sie können Filter auch kombinieren:
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}} })); }
Sie können auch OR
Aussagen erstellen:
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 } } ]} })); }
Sie können eine Bedingung auch negieren mitnot
:
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 } } ]} })); }
Sie können auch die folgenden Operatoren verwenden, um Werte zu vergleichen:
Operator | Beschreibung | Mögliche Wertetypen |
---|---|---|
eq | Gleich | Zahl, Zeichenfolge, boolescher Wert |
Eins | Ungleich | Zahl, Zeichenfolge, boolescher Wert |
le | Kleiner als oder gleich | Zahl, Zeichenfolge |
lt | kleiner als | Zahl, Zeichenfolge |
ge | Größer als oder gleich | Zahl, Zeichenfolge |
gt | größer als | Zahl, Zeichenfolge |
enthält | Wie | Zeichenfolge |
notContains | Nicht wie | Zeichenfolge |
beginsWith | Beginnt mit einem Präfix | Zeichenfolge |
zwischen | Zwischen zwei Werten | Zahl, Zeichenfolge |
attributeExists | Das Attribut ist nicht Null | Zahl, Zeichenfolge, boolescher Wert |
size | prüft die Länge des Elements | Zeichenfolge |
Das insert
Hilfsprogramm bietet eine einfache Möglichkeit, mit dem INSERT
Vorgang einzeilige Elemente in Ihre Datenbank einzufügen.
Einfügungen einzelner Elemente
Um ein Element einzufügen, geben Sie die Tabelle an und übergeben Sie dann Ihr Werteobjekt. Die Objektschlüssel sind Ihren Tabellenspalten zugeordnet. Spaltennamen werden automatisch maskiert, und Werte werden mithilfe der Variablenzuordnung an die Datenbank gesendet:
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) }
Mein SQL Anwendungsfall
Sie können ein insert
gefolgt von einem kombinierenselect
, um Ihre eingefügte Zeile abzurufen:
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) }
Anwendungsfall Postgres
Mit Postgres können Sie Daten aus der Zeile abrufen returning
*
oder ein Array von Spaltennamen:
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) }
Das update
Tool ermöglicht es Ihnen, bestehende Zeilen zu aktualisieren. Sie können das Bedingungsobjekt verwenden, um Änderungen an den angegebenen Spalten in allen Zeilen vorzunehmen, die die Bedingung erfüllen. Nehmen wir zum Beispiel an, wir haben ein Schema, das es uns ermöglicht, diese Mutation vorzunehmen. Wir wollen das name
von Person
mit dem id
Wert von aktualisieren, 3
aber nur, wenn wir sie (known_since
) seit dem Jahr kennen2000
:
mutation Update { updatePerson( input: {id: 3, name: "Jon"}, condition: {known_since: {ge: "2000"}} ) { id name } }
Unser Update Resolver sieht so aus:
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) }
Wir können unserer Bedingung ein Häkchen hinzufügen, um sicherzustellen, dass nur die Zeile aktualisiert 3
wird, deren Primärschlüssel id
gleich ist. In ähnlicher Weise können Sie Postgres verwendeninserts
, returning
um die geänderten Daten zurückzugeben.
Das remove
Hilfsprogramm ermöglicht es Ihnen, bestehende Zeilen zu löschen. Sie können das Bedingungsobjekt für alle Zeilen verwenden, die die Bedingung erfüllen. Beachten Sie, dass delete
es sich um ein reserviertes Schlüsselwort in handelt JavaScript. remove
sollte stattdessen verwendet werden:
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) }
Umwandlung
In einigen Fällen benötigen Sie möglicherweise genauere Angaben zum richtigen Objekttyp, den Sie in Ihrer Anweisung verwenden möchten. Sie können die bereitgestellten Typhinweise verwenden, um den Typ Ihrer Parameter anzugeben. AWS AppSync unterstützt dieselben Typhinweise wie die DatenAPI. Sie können Ihre Parameter mithilfe der typeHint
Funktionen des AWS AppSync rds
Moduls umwandeln.
Das folgende Beispiel ermöglicht es Ihnen, ein Array als Wert zu senden, der als JSON Objekt umgewandelt wird. Wir verwenden den ->
Operator, um das Element index
2
im JSON Array abzurufen:
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 }
Casting ist auch nützlich bei der Handhabung und beim Vergleichen von DATE
TIME
, undTIMESTAMP
:
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) }
Hier ist ein weiteres Beispiel, das zeigt, wie Sie das aktuelle Datum und die aktuelle Uhrzeit senden können:
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)}`) }
Verfügbare Typhinweise
-
typeHint.DATE
- Der entsprechende Parameter wird als Objekt desDATE
Typs an die Datenbank gesendet. Das akzeptierte Format istYYYY-MM-DD
. -
typeHint.DECIMAL
- Der entsprechende Parameter wird als Objekt desDECIMAL
Typs an die Datenbank gesendet. -
typeHint.JSON
- Der entsprechende Parameter wird als Objekt desJSON
Typs an die Datenbank gesendet. -
typeHint.TIME
- Der entsprechende Zeichenkettenparameterwert wird als Objekt desTIME
Typs an die Datenbank gesendet. Das akzeptierte Format istHH:MM:SS[.FFF]
. -
typeHint.TIMESTAMP
- Der entsprechende Zeichenkettenparameterwert wird als Objekt desTIMESTAMP
Typs an die Datenbank gesendet. Das akzeptierte Format istYYYY-MM-DD HH:MM:SS[.FFF]
. -
typeHint.UUID
- Der entsprechende Zeichenkettenparameterwert wird als Objekt desUUID
Typs an die Datenbank gesendet.