PartiQL을 사용하는 DynamoDB

PartiQL은 AWS DynamoDB에 도입되었으며, AWS는 2020년에 announcement을 SQL과 유사한 명령을 실행하는 편안함으로 개발자의 삶을 더 쉽게 만듭니다.

파티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에 액세스하는 방법


  • AWS CLI
  • AWS 웹 콘솔
  • AWS SDK가 포함된 DynamoDB
  • NoSQL 워크벤치

  • PartiQL의 연습을 위해 테이블은 다음을 사용합니다.
  • Copa America 테이블의 DynamoDB 단일 테이블 설계.
  • 명령문의 CLI 실행을 위한 AWS CloudShell.
  • 명령문 실행을 위한 NodeJS 스니펫입니다.
  • AWS 웹 콘솔의 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 배경이 있는 새로운 개발자가 빠르게 시작할 수 있도록 도와줍니다.

    좋은 웹페이지 즐겨찾기