DynamoDB PartiQL – 첫 번째 부분: 삽입

11638 단어 dynamodbsqlinsertaws
NoSQL 데이터베이스에서 SQL 문장을 실행하는 것은 듣기에 매우 모순적이지만, 우리는 현재 DynamoDB와 상호작용을 하는 새로운 API가 생겼다. 이것은 SQL처럼 보인다.AWS 데이터 서비스는 자체 API가 있는 전문적으로 구축된 데이터베이스 서비스입니다.SQL 표준으로 인해 RDS의 관계 데이터베이스는 유사한 API를 공유합니다.그러나 비관계 데이터베이스에는 표준이 없다. 모든 NosQL 데이터베이스는 get/put API와 유사하더라도 공용어를 공유하지 않는다.Amazon은 이를 기반으로 통합 API를 구축하기 위해 오픈 소스 PartiQL을 사용하여 SQL과 유사한 액세스를 제공합니다.최근 DynamoDB를 위해 이뤄진 것이다.이것은 나의 첫 번째 테스트이다. 이것은 여러 부분의 블로그 문장이 될 것이다.나는 곧 가장 중요한 점을 언급할 것이다. 당신은 여전히 NoSQL 데이터베이스에 있다.그곳의'SQL'은 관계 데이터베이스에서 사용하는 SQL과 거의 공통점이 없다.INSERT, UPDATE, SELECT, DELETE 키워드를 도입하면 키 값 데이터를 관계 데이터베이스로 저장하지 않습니다. 행 세트가 아닌 항목을 배치하고 가져올 수 있습니다. 데이터베이스에 여러 항목을 연결하지 않습니다. ACID가 아닙니다.

AWS CLI


AWS CLI에서 실행되며, 현재 버전 2에서는 PartiQL을 사용할 수 없습니다.

[opc@a tmp]$ aws --version
aws-cli/2.1.3 Python/3.7.3 Linux/4.14.35-2025.400.9.el7uek.x86_64 exe/x86_64.oracle.7

[opc@a tmp]$ aws dynamodb execute-statement

usage: aws [options]   [ ...] [parameters]

aws: error: argument operation: Invalid choice, valid choices are:
그러나 버전 1에서 사용할 수 있습니다(버전 2가 "지금 안정적이므로 일반적인 용도로 권장됨"에도 불구하고). 그래서 버전 1을 임시로 설치했습니다.

cd /var/tmp
wget -c https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
unzip -o awscli-bundle.zip
sudo ./awscli-bundle/install -i /var/tmp/aws-cli/awscli1
alias aws='/var/tmp/aws-cli/awscli1/bin/aws "$@" --output json | jq --compact-output'
보시다시피, 나는 촘촘한 json 출력을 좋아합니다. 왜냐하면 이것은 블로그 게시물에 넣기 쉽기 때문입니다. 그러나 물론 당신은 이렇게 할 필요가 없습니다.너도 컨트롤러에서 같은 프로그램을 실행할 수 있다.

현재 이 기능은 모든 지역에 배치된 것이 아니기 때문에, 만약 당신이 그것을 볼 수 없다면 다른 지역을 검사하십시오.그것에 대한 공고는 거기에 있다. You now can use a SQL-compatible query language to query, insert, update, and delete table data in Amazon DynamoDB.내 블로그 글을 읽을 때, 위의 모든 내용이 유행이 지났을 수도 있습니다. 모든 지역에서 사용할 수 있고, 최신 AWS CLI를 사용할 수 있습니다.이 특성의 문서는 개발자 가이드에서 찾을 수 있습니다: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html

DDL


DDL과 유사한 CREATE TABLE가 없으므로 일반적인 API(콘솔, CLI 또는 API)를 사용하여 DynamoDB를 만들어야 합니다.

aws dynamodb create-table --attribute-definitions \
  AttributeName=MyKeyPart,AttributeType=N \
  AttributeName=MyKeySort,AttributeType=N \
 --key-schema \
  AttributeName=MyKeyPart,KeyType=HASH \
  AttributeName=MyKeySort,KeyType=RANGE \
 --billing-mode PROVISIONED \
 --provisioned-throughput ReadCapacityUnits=25,WriteCapacityUnits=25 \
 --table-name Demo
이것은 내가 GSI와 LSI의 aprevious post에서 사용한 표와 같다.이 테이블에는 MyKeyPart 속성의 해시 값과 MyKeySort의 범위에 따라 구역을 나누고 기본적으로 MyKeySort 속성에 국부 인덱스를 합니다.

삽입


간단한 insert 문을 사용하여 새 항목을 삽입할 수 있습니다.

[opc@a aws]$ aws dynamodb execute-statement --statement \
"insert into Demo value {'MyKeyPart':1,'MyKeySort':1,'MyUnstructuredData':'here is my first insert :)'}"

{"Items":[]}
INSERT 키워드 외에 RDBMS SQL과 유사한 것은 없습니다.SQL에서 INSERT는 한 줄에서 읽고VALUES 키워드는 테이블에서 검색하는 것이 아니라 테이블 값 구조 함수입니다.여기에 JSON 문서를 입력하기 위한 단수치 키워드가 있습니다.
인터랙티브 쿼리 콘솔에서 코드(SQL 키워드, 테이블 및 속성 식별자)와 데이터(예를 들어 내가 사용하는 숫자나 문자열)를 혼합해서 사용하는 것은 편리하지만 정확한 인코딩 방식은 아니다.모든 API와 마찬가지로 변수 인코딩을 사용하여 실행할 때 매개 변수로 전달해야 합니다.다음과 같은 이점을 제공합니다.

[opc@a aws]$ aws dynamodb execute-statement --statement \
"insert into Demo value {'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}" \
  --parameters '[{"N":"2"},{"N":"2"},{"S":"use parameters when embedding SQL in programs"}]'

{"Items":[]}
이것은 프로그램에서 SQL을 사용하는 정확한 방법입니다. SQL 텍스트는 매개 변수를 포함하고 값의 차지 문자로 귀속 변수라고도 부릅니다.얘네는 여기서 간단한 물음표(?)매개 변수 목록에서 순서대로 인용하다.일부 SQL 데이터베이스에서는 이름 지정 매개변수(: variable)도 지원하지만 여기서는 지원되지 않습니다.
텍스트를 바꾸는 것이 아니라 귀속 변수라는 것을 기억해야 합니다.문자열의 경우 SQL 텍스트에 따옴표로 묶을 수 없습니다.데이터 유형은 매개변수 목록에 선언됩니다.
수신할 데이터가 있을 때, 항목마다 네트워크가 왕복하는 것을 원하지 않습니다.대량 삽입을 보내는 방법은 다음과 같습니다.

[opc@a aws]$ aws dynamodb batch-execute-statement --statements \
'[ {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"2"},{"N":"1"},{"S":"a"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"2"},{"N":"2"},{"S":"b"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"2"},{"N":"3"},{"S":"c"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"2"},{"N":"4"},{"S":"d"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"2"},{"N":"5"},{"S":"e"}]} ]'

{"Responses":[{"TableName":"Demo"},{"TableName":"Demo","Error":{"Message":"Duplicate primary key exists in table","Code":"DuplicateItem"}},{"TableName":"Demo"},{"TableName":"Demo"},{"TableName":"Demo"}]}
일괄 처리 문장에 대해 일부 문장은 실패할 수 있으며, 응답에 일련의 오류가 포함될 수 있습니다.여기서 같은 MyKeyPart에 여러 개의 MyKeySort 값을 삽입했습니다.이 중 하나(MyKeyPart=2, MyKeySort=2)가 이미 존재하고 중복 키로 거부되었습니다.다른 것이 삽입되었습니다.
마지막으로, 다음은 프레젠테이션 테이블에 나와 있는 내용입니다.

문 목록에 반복 항목이 이미 있으면 전체 호출이 거부됩니다.

[opc@a aws]$ aws dynamodb batch-execute-statement --statements '[ {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"9"},{"N":"9"},{"S":"a"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"9"},{"N":"9"},{"S":"b"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"9"},{"N":"1"},{"S":"c"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"9"},{"N":"2"},{"S":"d"}]} , {"Statement":"insert into Demo value '"{'MyKeyPart':?,'MyKeySort':?,'MyUnstructuredData':?}"'","Parameters":[{"N":"9"},{"N":"3"},{"S":"e"}]} ]'

An error occurred (ValidationException) when calling the BatchExecuteStatement operation: Provided list of item keys contains duplicates
여기에 [{N: "9"}, {N: "9"} 중복이 존재하기 때문에 어떤 항목도 삽입되지 않았습니다.
불행히도, 나는 어쩔 수 없이 이곳의 한마디 한마디를 되풀이했다.나는 하나의 API를 더 좋아한다. 이 API에서 나는 매개 변수화 문장을 준비하고 많은 값으로 실행한다. 예를 들어 SQL 데이터베이스에 있는 그룹 인터페이스 등이다.그러나 NoSQL에서는 각 항목마다 고유한 구조가 있으며 다른 항목과는 다를 수 있습니다.

고르다


SELECT 문구로 프로젝트를 살펴보겠습니다.

[opc@a aws]$ aws dynamodb execute-statement --statement "select * from Demo"

{"Items":[
 {"MyKeyPart":{"N":"2"},"MyUnstructuredData":{"S":"a"},"MyKeySort":{"N":"1"}}
,{"MyKeyPart":{"N":"2"},"MyUnstructuredData":{"S":"use parameters when embedding SQL in programs"}
,"MyKeySort":{"N":"2"}},{"MyKeyPart":{"N":"2"},"MyUnstructuredData":{"S":"c"}
,"MyKeySort":{"N":"3"}},{"MyKeyPart":{"N":"2"},"MyUnstructuredData":{"S":"d"}
,"MyKeySort":{"N":"4"}},{"MyKeyPart":{"N":"2"},"MyUnstructuredData":{"S":"e"}
,"MyKeySort":{"N":"5"}},{"MyKeyPart":{"N":"1"},"MyUnstructuredData":{"S":"here is my first insert :)"}
,"MyKeySort":{"N":"1"}}]}
물론 나는 그것들이 분류되는 것을 보고 싶다.

[opc@a aws]$ aws dynamodb execute-statement --statement "select * from Demo order by MyKeyPart,MyKeySort"     
                                                
An error occurred (ValidationException) when calling the ExecuteStatement operation: Must have WHERE clause in the statement when using ORDER BY clause.
이것은 우리에게 partql이 데이터베이스 엔진이 아니라는 것을 일깨워 준다.기본 데이터베이스에서 정렬 결과 집합을 지원하지 않으면 정렬 결과 집합을 제공할 수 없습니다.DynamoDB는 분포식 데이터베이스로 해시 구역을 통과한다. 이것은 스캔 (이 SELECT 뒤의 작업은 내가where 자구가 없어서 구역을 선택하지 않기 때문에) 순서대로 결과를 되돌려주지 않는다는 것을 의미한다.이것은 DynamoDB의 기본 개념이다. 신축성과 예측성을 가지기 위해 크로스 구역 조작이 존재하지 않는다.그 위에 SQL 언어를 사용하는 것은 이 점을 바꾸지 않는다.

[opc@a aws]$ aws dynamodb execute-statement --statement "select MyKeyPart,MyKeySort from Demo where MyKeyPart=2 order by MyKeyPart,MyKeySort"

{"Items":[{"MyKeyPart":{"N":"2"},"MyKeySort":{"N":"1"}},{"MyKeyPart":{"N":"2"},"MyKeySort":{"N":"2"}},{"MyKeyPart":{"N":"2"},"MyKeySort":{"N":"3"}},{"MyKeyPart":{"N":"2"},"MyKeySort":{"N":"4"}},{"MyKeyPart":{"N":"2"},"MyKeySort":{"N":"5"}}]}
이것은 ORDER BY를 받아들인다. 왜냐하면 나는 WHERE 자구 (산열 키의 같은 술어) 를 사용하여 조작을 단일 구역에 명확하게 제한하기 때문이다.DynamoDB에서 로컬 인덱스의 범위 키를 정렬하고 이 순서대로 항목을 스캔할 수 있도록 요청합니다.마찬가지로 PartiQL은 데이터베이스 엔진이 아니라는 것을 기억해야 합니다.엔진은 DynamoDB입니다.PartiQL은 SQL과 유사한 언어를dynamodbnosqlapi에 비칩니다.물론, 모든 데이터 작업은 일반적인 API로 할 수 있습니다.그러나 SELECT에 대해서는 더 많은 이야기가 있다. 이는 두 번째 부분(https://blog.dbi-services.com/dynamodb-partiql-part-ii-select에 있을 것이다)

좋은 웹페이지 즐겨찾기