Exemple #1
0
    async def update_item(cls, table_name: str, key: dict, update: UpdateExpression,
                          condition: ConditionExpression = None, raw_table_name=False):
        """
        アイテムを更新

        :param table_name: 対象テーブル名
        :param key: ハッシュキー及びレンジキーの指定式
        :param update: 更新値式インスタンス
        :param condition: 更新条件式インスタンス
        :return: AWSレスポンス
        """
        _start = cls._take()

        p = {
            'TableName': cls.resolve_table_name(table_name, raw_table_name),
            'Key': key,
            **(update.to_parameter(condition))
        }

        if cls._use_profiler:
            p['ReturnConsumedCapacity'] = 'INDEXES'
        res = await cls._client.update_item(**p)

        cls._cheese(_start, f'update_item {table_name}', p)
        if cls._use_profiler:
            if key.get('kind', None):
                QueryCounter.count('update', f"{table_name} - {key['kind']['S'].split('//')[0]}")
            else:
                QueryCounter.count('update', f"{table_name}")
            consumed_cu = res.get('ConsumedCapacity', False)
            if consumed_cu:
                QueryCounter.count_write_ccu(consumed_cu)
        return res
Exemple #2
0
    async def batch_write_item(cls, request_items: dict):
        _start = cls._take()
        p = {
            'RequestItems': request_items
        }
        res = await cls._client.batch_write_item(**p)
        cls._cheese(_start, 'batch_write_item', p)

        if cls._use_profiler:
            p['ReturnConsumedCapacity'] = 'INDEXES'
        res = await cls._client.batch_write_item(**p)
        cls._cheese(_start, 'batch_write_item', p)
        if cls._use_profiler:
            QueryCounter.count('batch_write')
            consumed_cu_list = res.get('ConsumedCapacity', False)
            for consumed_cu in consumed_cu_list:
                QueryCounter.count_write_ccu(consumed_cu)
        return res['UnprocessedItems']
Exemple #3
0
    async def transaction_write(cls, items: list):
        _start = cls._take()
        p = {
            'TransactItems': items
        }

        res = await cls._client.transact_write_items(**p)
        cls._cheese(_start, 'transact_write', p)
        if cls._use_profiler:
            p['ReturnConsumedCapacity'] = 'INDEXES'
        res = await cls._client.transact_write_items(**p)
        cls._cheese(_start, 'transact_write', p)

        if cls._use_profiler:
            QueryCounter.count('transact_write')
            consumed_cu_list = res.get('ConsumedCapacity', False)
            for consumed_cu in consumed_cu_list:
                QueryCounter.count_write_ccu(consumed_cu)
        return res
Exemple #4
0
    async def put_item(cls, table_name: str, item: dict, condition: ConditionExpression = None, raw_table_name=False):
        """
        | アイテムを作成
        | 更新条件式が成立しなかった場合は例外が発生する

        :param table_name: 対象テーブル名
        :param item: シリアライズされたアイテム情報を格納した辞書配列
        :param condition: 更新条件式インスタンス
        :param raw_table_name: テーブル名にプリフィックスを付与しない
        :return: AWSレスポンス
        """
        _start = cls._take()

        p = {
            'TableName': cls.resolve_table_name(table_name, raw_table_name),
            'Item': item,

            **(condition.to_parameter() if condition is not None else {})
        }
        if cls._use_profiler:
            p['ReturnConsumedCapacity'] = 'INDEXES'

        res = await cls._client.put_item(**p)

        cls._cheese(_start, f'put_item {table_name}', p)
        if cls._use_profiler:
            if item.get('kind', None):
                QueryCounter.count('put', f"{table_name} - {item['kind']['S'].split('//')[0]}")
            else:
                QueryCounter.count('put', f"{table_name}")

            consumed_cu = res.get('ConsumedCapacity', False)
            if consumed_cu:
                QueryCounter.count_write_ccu(consumed_cu)

        return res