PartiQL을 사용하는 DynamoDB
파티QL이란?
A SQL-compatible query language — in addition to already-available DynamoDB operations—to query, insert, update, and delete table data in Amazon DynamoDB. PartiQL makes it easier to interact with DynamoDB and run queries in the AWS Management Console. Because PartiQL is supported for all DynamoDB data-plane operations, it can help improve the productivity of developers by enabling them to use a familiar, structured query language to perform these operations.
DynamoDB용 PartiQL에 액세스하는 방법
PartiQL의 연습을 위해 테이블은 다음을 사용합니다.
DynamoDB 테이블 생성
DynamoDB 테이블
copa-america
에는 파티션 키로 pk
스키마가 있고 정렬 키로 sk
스키마가 있습니다. 또한 DynamoDB를 주문형으로 프로비저닝하므로 billing-mode PAY_PER_REQUEST
를 설정합니다.aws dynamodb create-table --attribute-definitions \
AttributeName=pk,AttributeType=S \
AttributeName=sk,AttributeType=S \
--key-schema \
AttributeName=pk,KeyType=HASH \
AttributeName=sk,KeyType=RANGE \
--billing-mode PAY_PER_REQUEST\
--table-name copa-america
콘솔에서 생성된 테이블 세부 정보를 확인할 수 있습니다.
팀 세부 정보 삽입
PartiQL로 삽입하는 가장 간단한 방법은 SQL 문과 유사한
INSERT
문을 사용하는 것입니다.INSERT INTO "copa-america" VALUE {'pk':'TEAM','sk':'Argentina#Group A#1','display_name':'Argentina','team_group':'Group A','ranking':1,'matches_played':4,'matches_won':3,'matches_drew':1,'matches_lost':0,'goals_for':7,'goals_against':2,'goals_difference':5,'team_points':10}
NodeJS와 동일하게
executeStatement
API를 사용하여 실행할 수 있습니다.const insert_teams = async(event) => {
let team = event.team
let teamParams = {
pk: "TEAM",
sk: team.name + "#" + team.group + "#" + team.ranking,
display_name: team.name,
team_group: team.group,
ranking: team.ranking,
matches_played: team.matches_played,
matches_won: team.matches_won,
matches_drew: team.matches_drew,
matches_lost: team.matches_lost,
goals_for: team.goals_for,
goals_against: team.goals_against,
goals_difference: team.goals_difference,
team_points: team.team_points
}
let partiqlStmt = {
Statement: `INSERT INTO "testing-partiql" VALUE "{'pk':'${teamParams.pk}','sk':'${teamParams.sk}','display_name':'${teamParams.display_name}','team_group':'${teamParams.team_group}','ranking':${teamParams.ranking},'matches_played':${teamParams.matches_played},'matches_won':${teamParams.matches_won},'matches_drew':${teamParams.matches_drew},'matches_lost':${teamParams.matches_lost},'goals_for':${teamParams.goals_for},'goals_against':${teamParams.goals_against},'goals_difference':${teamParams.goals_difference},'team_points':${teamParams.team_points}}"`,
}
let response = await dynamodb.executeStatement(partiqlStmt).promise()
return response
}
batchWriteItem
의 유사한 기능을 사용하여 PartiQL을 사용하면 batchExecuteStatement
를 사용하여 명령문의 일괄 실행을 수행할 수 있습니다.aws dynamodb batch-execute-statement --statements \
> '[{"Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Uruguay#Group A#2','display_name':'Uruguay','team_group':'Group A','ranking':2,'matches_played':4,'matches_won':2,'matches_drew':1,'matches_lost':1,'goals_for':4,'goals_against':2,'goals_difference':2,'team_points':7}\"" }, { "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Paraguay#Group A#3','display_name':'Paraguay','team_group':'Group A','ranking':3,'matches_played':4,'matches_won':2,'matches_drew':0,'matches_lost':2,'goals_for':5,'goals_against':3,'goals_difference':2,'team_points':6}\""}, { "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Chile#Group A#4','display_name':'Chile','team_group':'Group A','ranking':4,'matches_played':4,'matches_won':1,'matches_drew':2,'matches_lost':1,'goals_for':3,'goals_against':4,'goals_difference':-1,'team_points':5}\"" }, { "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Bolivia#Group A#5','display_name':'Bolivia','team_group':'Group A','ranking':5,'matches_played':4,'matches_won':0,'matches_drew':0,'matches_lost':4,'goals_for':2,'goals_against':10,'goals_difference':-8,'team_points':0}\"" }, {"Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Brazil#Group b#1','display_name':'Brazil','team_group':'Group b','ranking':1,'matches_played':4,'matches_won':3,'matches_drew':1,'matches_lost':0,'goals_for':10,'goals_against':2,'goals_difference':8,'team_points':10}\"" }, { "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Peru#Group b#2','display_name':'Peru','team_group':'Group b','ranking':2,'matches_played':4,'matches_won':2,'matches_drew':1,'matches_lost':1,'goals_for':5,'goals_against':7,'goals_difference':-2,'team_points':7}\""}, { "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Colombia#Group B#3','display_name':'Colombia','team_group':'Group B','ranking':3,'matches_played':4,'matches_won':1,'matches_drew':1,'matches_lost':2,'goals_for':3,'goals_against':4,'goals_difference':-1,'team_points':4}\""},{"Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Ecuador#Group B#5','display_name':'Ecuador','team_group':'Group B','ranking':5,'matches_played':4,'matches_won':0,'matches_drew':3,'matches_lost':1,'goals_for':6,'goals_against':6,'goals_difference':-1,'team_points':3}\"" },{ "Statement": "INSERT INTO \"copa-america\" VALUE \"{'pk':'TEAM','sk':'Venezuela#Group B#5','display_name':'Venezuela','team_group':'Group B','ranking':5,'matches_played':4,'matches_won':0,'matches_drew':2,'matches_lost':2,'goals_for':2,'goals_against':6,'goals_difference':-4,'team_points':2}\""}]'
마찬가지로 NodeJS 실행에서
const insert_teams_bulk = async(event) => {
let partiqlInsertParams = {
Statements: []
}
for (let team of event.teams) {
let teamParams = {
pk: "TEAM",
sk: team.name + "#" + team.group + "#" + team.ranking,
display_name: team.name,
team_group: team.group,
ranking: team.ranking,
matches_played: team.matches_played,
matches_won: team.matches_won,
matches_drew: team.matches_drew,
matches_lost: team.matches_lost,
goals_for: team.goals_for,
goals_against: team.goals_against,
goals_difference: team.goals_difference,
team_points: team.team_points
}
let partiqlStmt = {
Statement: `INSERT INTO "testing-partiql" VALUE "{'pk':'${teamParams.pk}','sk':'${teamParams.sk}','display_name':'${teamParams.display_name}','team_group':'${teamParams.team_group}','ranking':${teamParams.ranking},'matches_played':${teamParams.matches_played},'matches_won':${teamParams.matches_won},'matches_drew':${teamParams.matches_drew},'matches_lost':${teamParams.matches_lost},'goals_for':${teamParams.goals_for},'goals_against':${teamParams.goals_against},'goals_difference':${teamParams.goals_difference},'team_points':${teamParams.team_points}}"`,
}
partiqlInsertParams.Statements.push(partiqlStmt)
}
let response = await dynamodb.batchExecuteStatement(partiqlInsertParams).promise()
return response
}
항목 검색
검색은 PartiQL을 사용하여
SELECT
문으로 수행됩니다.스캔 작업
aws dynamodb execute-statement --statement "select * from \"copa-america\""
결과
새로운 DynamoDB 콘솔에서 사용할 수 있는 웹 콘솔 PartiQL 편집기.
Copa America의 모든 팀을 얻기 위해 스캔
SELECT * FROM "copa-america" WHERE "pk" = 'TEAM'
DynamoDB의 경우 PartiQL을 사용한 프로젝션 표현식 지원은
SELECT
의 속성을 지정하여 SQL 문이 지원되는 방식으로 수행됩니다.aws dynamodb execute-statement --statement "SELECT display_name FROM \"copa-america\" WHERE \"pk\" = 'TEAM'"
{
"Items": [
{
"display_name": {
"S": "Argentina"
}
},
{
"display_name": {
"S": "Bolivia"
}
},
{
"display_name": {
"S": "Brazil"
}
},
{
"display_name": {
"S": "Chile"
}
},
{
"display_name": {
"S": "Colombia"
}
},
{
"display_name": {
"S": "Ecuador"
}
},
{
"display_name": {
"S": "Paraguay"
}
},
{
"display_name": {
"S": "Peru"
}
},
{
"display_name": {
"S": "Uruguay"
}
},
{
"display_name": {
"S": "Venezuela"
}
}
]
}
위의 PartiQL 문은 수행되는
pk
작업이므로 WHERE
원인에 SCAN
를 사용하지만 내부적으로 정의된 sk
을 사용하여 응답 항목을 정렬합니다.PartiQL로 쿼리하기
DynamoDB의 쿼리는 PartiQL과 동일한 방식으로 작동하므로 파티션의 키 스키마를 활용하고 키를 정렬하여 DynamoDB 테이블에서 쿼리할 수 있습니다.
SELECT * FROM "copa-america" WHERE "pk" = 'MATCH' and contains("sk",'ARG')
aws dynamodb execute-statement --statement "SELECT display_name,match_type,final_score FROM \"copa-america\" WHERE \"pk\" = 'MATCH' and contains(\"sk\",'ARG')"
DynamoDB를 쿼리할 때 인덱스는 특정 보기로 데이터를 가져오는 데 중요한 역할을 합니다. 이는
SELECT
의 "table-name"."index-name"
문으로도 달성됩니다.aws dynamodb execute-statement --statement "SELECT * FROM \"copa-america\".\"team_group-index\" where \"team_group\"='Group A'"
DynamoDB에서 값 업데이트
DynamoDB는 테이블 스키마에 정의된 파티션 및 정렬 키로 항목 업데이트를 프로비저닝하며, PartiQL의
UPDATE-SET
문에서도 동일하게 가능합니다.UPDATE "copa-america" SET "match_date" = '2021-07-11' WHERE "pk" = 'MATCH' AND "sk" = 'F#ARG#BRA'
DynamoDB에서 레코드 삭제
DynamoDB의 삭제 작업은 PartiQL의
DROP
문으로 수행됩니다.DELETE FROM "copa-america" WHERE "pk" = 'TEAM' AND "sk" = 'Bolivia#Group A#5'
PartiQL 편집기
PartiQL Editor 섹션의 웹 콘솔에서도 동일한 작업이 가능합니다.
PartiQL 편집기는 몇 가지 옵션을 묻는 메시지를 표시하고 선택 시 PartiQL 문의 구문을 표시하여 더 쉽고 개발자 친화적입니다.
결론
PartiQL을 사용하는 DynamoDB는 모든 DynamoDB 지원 작업에 대한 구문 스니펫(
PUT
, SCAN
, QUERY
, UPDATE
, DELETE
과 SQL 유사 문 - INSERT
, SELECT
, UPDATE
, DROP
구조화된 쿼리로 쉽게 만들 수 있습니다. 또한 SQL 배경이 있는 새로운 개발자가 빠르게 시작할 수 있도록 도와줍니다.
Reference
이 문제에 관하여(PartiQL을 사용하는 DynamoDB), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/awscommunity-asean/dynamodb-with-partiql-2693텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)