This example outlines how to attach a database table that’s in the same Amazon RDS instance as the example solution. Suppose you want to attach your MyAppliedDiscount table to apply a discount for one or more order items.
Update the Schema
Add the type and input declarations for the MyAppliedDiscount table to the GraphQL schema.
input AWSDateOperator {
eq: AWSDate
gt: AWSDate
ge: AWSDate
in: [AWSDate]
like: AWSDate
lt: AWSDate
le: AWSDate
ne: AWSDate
nin: [AWSDate]
}
input AWSDateTimeOperator {
eq: AWSDateTime
gt: AWSDateTime
ge: AWSDateTime
in: [AWSDateTime]
like: AWSDateTime
lt: AWSDateTime
le: AWSDateTime
ne: AWSDateTime
nin: [AWSDateTime]
}
input AWSJSONOperator {
eq: AWSJSON
gt: AWSJSON
ge: AWSJSON
in: [AWSJSON]
like: AWSJSON
lt: AWSJSON
le: AWSJSON
ne: AWSJSON
nin: [AWSJSON]
}
input AWSTimeOperator {
eq: AWSTime
gt: AWSTime
ge: AWSTime
in: [AWSTime]
like: AWSTime
lt: AWSTime
le: AWSTime
ne: AWSTime
nin: [AWSTime]
}
input BooleanOperator {
eq: Boolean
gt: Boolean
ge: Boolean
in: [Boolean]
like: Boolean
lt: Boolean
le: Boolean
ne: Boolean
nin: [Boolean]
}
enum Direction {
ASC
DESC
}
enum Enumeration {
VALUE1
VALUE2
VALUE3
VALUE4
VALUE5
VALUE6
VALUE7
VALUE8
VALUE9
}
input FloatOperator {
eq: Float
gt: Float
ge: Float
in: [Float]
like: Float
lt: Float
le: Float
ne: Float
nin: [Float]
}
input IDOperator {
eq: ID
gt: ID
ge: ID
in: [ID]
like: ID
lt: ID
le: ID
ne: ID
nin: [ID]
}
input IntOperator {
eq: Int
gt: Int
ge: Int
in: [Int]
like: Int
lt: Int
le: Int
ne: Int
nin: [Int]
}
type Mutation {
create_MyOrder(input: MyOrder_CreateInput!): MyOrder
create_MyOrderItem(input: MyOrderItem_CreateInput!): MyOrderItem
create_MyProduct(input: MyProduct_CreateInput!): MyProduct
create_MyAppliedDiscount(input: MyAppliedDiscount_CreateInput!): MyAppliedDiscount
delete_MyOrder(id: ID!): MyOrder
delete_MyOrderItem(id: ID!): MyOrderItem
delete_MyProduct(id: ID!): MyProduct
delete_MyAppliedDiscount(id: ID!): MyAppliedDiscount
update_MyOrder(input: MyOrder_UpdateInput!): MyOrder
update_MyOrderItem(input: MyOrderItem_UpdateInput!): MyOrderItem
update_MyProduct(input: MyProduct_UpdateInput!): MyProduct
update_MyAppliedDiscount(input: MyAppliedDiscount_UpdateInput!): MyAppliedDiscount
}
type MyAppliedDiscount implements Node {
id: ID!
DiscountId: ID!
OrderItemOrderId: String
OrderItemProductId: String
Multiplier: Float
}
type MyAppliedDiscount_Connection {
edges: [MyAppliedDiscount_Edge]
pageInfo: PageInfo!
}
input MyAppliedDiscount_CreateInput {
DiscountId: ID!
OrderItemOrderId: String
OrderItemProductId: String
Multiplier: Float
}
type MyAppliedDiscount_Edge {
cursor: String!
node: MyAppliedDiscount
}
input MyAppliedDiscount_FilterInput {
and: [MyAppliedDiscount_FilterInput]
not: MyAppliedDiscount_FilterInput
or: [MyAppliedDiscount_FilterInput]
id: IDOperator
DiscountId: StringOperator
OrderItemOrderId: StringOperator
OrderItemProductId: StringOperator
Multiplier: FloatOperator
}
input MyAppliedDiscount_OrderByInput {
id: OrderByClause
DiscountId: OrderByClause
OrderItemOrderId: OrderByClause
OrderItemProductId: OrderByClause
Multiplier: OrderByClause
}
input MyAppliedDiscount_UpdateInput {
id: ID!
DiscountId: ID!
OrderItemOrderId: String
OrderItemProductId: String
Multiplier: Float
}
type MyOrder implements Node {
id: ID!
OrderId: ID!
OrderDate: AWSDateTime
Status: String
TotalCost: Float
}
type MyOrderItem implements Node {
id: ID!
ParentOrderId: ID!
ParentProductId: ID!
Quantity: Int
}
type MyOrderItem_Connection {
edges: [MyOrderItem_Edge]
pageInfo: PageInfo!
}
input MyOrderItem_CreateInput {
ParentOrderId: ID
ParentProductId: ID
Quantity: Int
}
type MyOrderItem_Edge {
cursor: String!
node: MyOrderItem
}
input MyOrderItem_FilterInput {
and: [MyOrderItem_FilterInput]
not: MyOrderItem_FilterInput
or: [MyOrderItem_FilterInput]
id: IDOperator
ParentOrderId: StringOperator
ParentProductId: StringOperator
Quantity: IntOperator
}
input MyOrderItem_OrderByInput {
id: OrderByClause
ParentOrderId: OrderByClause
ParentProductId: OrderByClause
Quantity: OrderByClause
}
input MyOrderItem_UpdateInput {
id: ID!
ParentOrderId: ID
ParentProductId: ID
Quantity: Int
}
type MyOrder_Connection {
edges: [MyOrder_Edge]
pageInfo: PageInfo!
}
input MyOrder_CreateInput {
OrderDate: AWSDateTime
OrderId: ID!
Status: String
TotalCost: Float
}
type MyOrder_Edge {
cursor: String!
node: MyOrder
}
input MyOrder_FilterInput {
and: [MyOrder_FilterInput]
not: MyOrder_FilterInput
or: [MyOrder_FilterInput]
id: IDOperator
OrderDate: AWSDateTimeOperator
OrderId: StringOperator
Status: StringOperator
TotalCost: FloatOperator
}
input MyOrder_OrderByInput {
id: OrderByClause
OrderId: OrderByClause
OrderDate: OrderByClause
Status: OrderByClause
TotalCost: OrderByClause
}
input MyOrder_UpdateInput {
id: ID!
OrderDate: AWSDateTime
OrderId: String
Status: String
TotalCost: Float
}
type MyProduct implements Node {
id: ID!
ProductId: ID!
Name: String
Price: Float
Discontinued: Boolean
}
type MyProduct_Connection {
edges: [MyProduct_Edge]
pageInfo: PageInfo!
}
input MyProduct_CreateInput {
ProductId: ID!
Name: String
Price: Float
Discontinued: Boolean
}
type MyProduct_Edge {
cursor: String!
node: MyProduct
}
input MyProduct_FilterInput {
and: [MyProduct_FilterInput]
not: MyProduct_FilterInput
or: [MyProduct_FilterInput]
id: IDOperator
ProductId: StringOperator
Name: StringOperator
Price: FloatOperator
Discontinued: BooleanOperator
}
input MyProduct_OrderByInput {
id: OrderByClause
ProductId: OrderByClause
Name: OrderByClause
Price: OrderByClause
Discontinued: OrderByClause
}
input MyProduct_UpdateInput {
id: ID!
ProductId: String
Name: String
Price: Float
Discontinued: Boolean
}
interface Node {
id: ID!
}
enum NullsOrder {
NULLS_FIRST
NULLS_LAST
}
input OrderByClause {
direction: Direction
nulls: NullsOrder
}
type PageInfo {
endCursor: String
hasNextPage: Boolean!
}
type Query {
myOrder(
limit: Int,
offset: Int,
orderBy: [MyOrder_OrderByInput],
where: MyOrder_FilterInput,
first: Int,
after: String
): MyOrder_Connection
myOrderItem(
limit: Int,
offset: Int,
orderBy: [MyOrderItem_OrderByInput],
where: MyOrderItem_FilterInput,
first: Int,
after: String
): MyOrderItem_Connection
myProduct(
limit: Int,
offset: Int,
orderBy: [MyProduct_OrderByInput],
where: MyProduct_FilterInput,
first: Int,
after: String
): MyProduct_Connection
myAppliedDiscount(
limit: Int,
offset: Int,
orderBy: [MyAppliedDiscount_OrderByInput],
where: MyAppliedDiscount_FilterInput,
first: Int,
after: String
): MyAppliedDiscount_Connection
node(id: ID!): Node
}
input StringOperator {
eq: String
gt: String
ge: String
in: [String]
like: String
lt: String
le: String
ne: String
nin: [String]
}
Update the Table Metadata
Add metadata entries in the Parameter Store for the MyAppliedDiscount table.
**/appsync/typemetadata/MyOrder**
{
"secretName": "graphqlsample",
"secretRegion": "us-west-2",
"keyFields": [
"OrderId"
],
"databaseTableName": "graphqlsample.my_order",
"graphQLFields": {
"OrderId": {
"fieldType": "String",
"columnName": "order_id"
},
"OrderDate": {
"fieldType": "AWSDateTime",
"columnName": "order_date"
},
"Status": {
"fieldType": "String",
"columnName": "status"
},
"TotalCost": {
"fieldType": "Float",
"columnName": "total_cost"
}
}
}
**/appsync/typemetadata/MyOrderItem**
{
"secretName": "graphqlsample",
"secretRegion": "us-west-2",
"keyFields": [
"ParentOrderId",
"ParentProductId"
],
"databaseTableName": "graphqlsample.my_order_item",
"graphQLFields": {
"ParentOrderId": {
"fieldType": "String",
"columnName": "parent_order_id"
},
"ParentProductId": {
"fieldType": "String",
"columnName": "parent_product_id"
},
"Quantity": {
"fieldType": "Int",
"columnName": "quantity"
}
}
}
**/appsync/typemetadata/MyProduct**
{
"secretName": "graphqlsample",
"secretRegion": "us-west-2",
"keyFields": ["ProductId"],
"databaseTableName": "graphqlsample.my_product",
"graphQLFields": {
"ProductId": {
"fieldType": "String",
"columnName": "product_id"
},
"Name": {
"fieldType": "String",
"columnName": "name"
},
"Price": {
"fieldType": "Float",
"columnName": "price"
},
"Discontinued": {
"fieldType": "Boolean",
"columnName": "discontinued"
}
}
}
**/appsync/typemetadata/MyAppliedDiscount**
{
"secretName": "graphqlsample",
"secretRegion": "us-west-2",
"keyFields": [
"DiscountId",
"OrderItemOrderId",
"OrderItemProductId"
],
"databaseTableName": "postgres.my_applied_discount",
"graphQLFields": {
"DiscountId": {
"fieldType": "String",
"columnName": "discount_id"
},
"OrderItemOrderId": {
"fieldType": "String",
"columnName": "order_item_order_id"
},
"OrderItemProductId": {
"fieldType": "String",
"columnName": "order_item_product_id"
},
"Multiplier": {
"fieldType": "Float",
"columnName": "multiplier"
}
}
}
Generate Table Qualifiers
MyOrder
This is a sample table qualifier generated for an external ID based on the id field of the MyOrder table.
{
"columns": {
"id": {
"values": [
{
"definition": "\"MyOrder-\"&SUBSTITUTE(ExternalId, \"-\", \"\\\\-\")"
}
]
},
"ExternalId": {
"virtual": true,
"values": [
{
"definition": "SUBSTITUTE(RIGHT(id, LEN(id)-8), \"\\\\-\", \"-\")"
}
]
}
}
}
MyOrderItem
This is a sample table qualifier generated for an external ID based on the id field of the MyOrderItem table.
{
"columns": {
"id": {
"values": [
{
"definition": "\"MyOrderItem-\"&SUBSTITUTE(SUBSTITUTE(ExternalId, \"-\", \"\\\\-\"), \"\\\\-PRD\", \"-PRD\")"
}
]
},
"ExternalId": {
"virtual": true,
"values": [
{
"definition": "SUBSTITUTE(RIGHT(id, LEN(id)-12), \"\\\\-\", \"-\")"
}
]
}
}
}
MyProduct
This is a sample table qualifier generated for an external ID based on the id field of the MyProduct table.
{
"columns": {
"id": {
"values": [
{
"definition": "\"MyProduct-\"&SUBSTITUTE(ExternalId, \"-\", \"\\\\-\")"
}
]
},
"ExternalId": {
"virtual": true,
"values": [
{
"definition": "SUBSTITUTE(RIGHT(id, LEN(id)-10), \"\\\\-\", \"-\")"
}
]
}
}
}
MyAppliedDiscount
This is a sample table qualifier for a virtual external ID defined using the values formula.
{
"columns": {
"id": {
"values": [
{
"definition": "\"MyAppliedDiscount-\"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(ExternalId, \"-\", \"\\\\-\"), \"\\\\-ORD\", \"-ORD\"), \"\\\\-PRD\", \"-PRD\")"
}
]
},
"ExternalId": {
"virtual": true,
"values": [
{
"definition": "SUBSTITUTE(RIGHT(id, LEN(id)-18), \"\\\\-\", \"-\")"
}
]
},
"OrderItemId": {
"virtual": true,
"values": [
{
"definition": "OrderItemOrderId&\"-\"&OrderItemProductId"
}
]
},
"OrderItemOrderId": {
"values": [
{
"definition": "LEFT(OrderItemId, FIND(\"-PRD\", OrderItemId)-1)"
}
]
},
"OrderItemProductId": {
"values": [
{
"definition": "RIGHT(OrderItemId, LEN(OrderItemId)-FIND(\"-PRD\",OrderItemId))"
}
]
}
}
}