Dynamodb query 정리

0. 공통적으로 알아야 할 내용
1) "!=" 대신 "<>"를 써야하는 것 같다.
2) reserved keyword가 있다. ex> user,...
사용하고 싶으면 "ExpressionAttributeNames" 옵션을 써야 한다.  (이 페이지 참조)
3) 형식에 엄격한 편.
4) ExpressionAttributeValues, ExpressionAttributeNames 등에 설정한 값은 반드시 사용해야함.

1. Python

1) 코드
import boto3

dynamodb = boto3.resource("dynamodb", region_name=MY_REGION,
    aws_access_key_id=MY_KEY_ID, aws_secret_access_key=MY_KEY)
table = dynamodb.Table(TABLE_NAME)

table.query(
    IndexName=INDEX_NAME,
    KeyConditionExpression='KEYNAME = :KEYVALUE and #ATTR1 = :ATTRVALUE',
    FilterExpression='FILTERNAME = :FILTERVALUE',
    ProjectionExpression='attr1, attr2'
    ExpressionAttributeValues={
        ':KEYVALUE': '...',
        ':FILTERVALUE': '...',
        ':ATTRVALUE': '...',
    },
    ExpressionAttributeNames={
        '#ATTR1': 'user'
    },
    ScanIndexForward=False
)

2) 상세
- IndexName : 찾을 index 이름. 전체 테이블이 대상인 경우 생략가능
- KeyConditionExpression : index에 포함된 키에 대한 표현. 키 외의 필드를 쓸 수 없음.
- FilterExpression : index에 포함되지 않은 필드로 필터링하고 싶을 때 사용.
- ProjectionExpression: 가져오고 싶은 필드. 없으면 모든 필드를 가져옴.
- ExpressionAttributeValues: expression 내에 :VALUENAME 형태로 쓴 부분의 실제 값을 dict로
- ExpressionAttributeValues: expression 내에 #ATTRNAME 형태로 쓴 부분의 실제 값을 dict로
- ScanIndexForward: index의 sort key를 오름차순(True) 혹은 내림차순(False)로 찾을 때. 기본은 True
- 그 외 옵션은 (이 페이지 참조)


3) 기타
- dynamodb number 타입은 python의 Decimal이 된다. json.dumps()로 serialize하기 위해 Decimal을 serialize할 수 있는 클래스를 지정해줘야 한다. (이 페이지 참조)
- 한 번에 1KB 씩만 찾아 올 수 있다(필터 적용 안하고). 더 찾을 값이 있다면 LastEvaluatedKey가 리턴되고, 이 값을 ExclusiveStartKey 옵션에 넣어서 다시 query하면 그 다음부터 찾아진다.

2. Javascript

이 블로그의 인기 게시물

Postgresql에서 5432 port가 열려있냐는 문제(Ubuntu 기준)

vue에서 v-html에 포함된 class의 css가 적용되지 않는 경우

Linux screen 명령어 정리