首頁  >  文章  >  後端開發  >  在 Python 中為 DynamoDB 設定 REST API

在 Python 中為 DynamoDB 設定 REST API

Patricia Arquette
Patricia Arquette原創
2024-11-17 20:42:02419瀏覽

Dynamo DB 是 AWS 在大量託管資料庫中提供的 NoSQL 產品,作為其提供的服務。與大多數其他服務一樣,它完全無伺服器、靈活且易於擴展。

資料模型

由於我們正在研究 NoSQL,因此對資料結構沒有真正的限制。我們可以使用鍵值對作為表中每個屬性進行操作。 讓我們再看看這些關鍵字。

- 一個相當熟悉的術語,它本質上是資料的集合,在本例中為項目。這也是在控制台上使用 DynamoDB 的起點。

Item - 表中的條目。您可以將其視為 SQL 等效資料庫中的一行。

屬性 - 構成項目的資料點。它可以包含特定於項目的屬性、元資料或幾乎任何可以與項目關聯的內容。

您可以將 JSON 陣列視為 DynamoDB 中的表格的等效項。我相信當我們創建自己的表格時,事情會變得更加清晰。

設定資料庫

從 AWS 控制台在 DynamoDB 中建立新表簡直就是小菜一碟。您所需要的只是一個名稱和一個分區鍵,在本例中這是您的主鍵。這將幫助您搜尋表中的項目。

Setting up a REST API in Python for DynamoDB

我正在為我玩過的所有遊戲創建一個表格,我會給它們評分(滿分 10 分):)

Setting up a REST API in Python for DynamoDB

您可以直接從控制台弄亂表格,讓我們嘗試新增一個項目看看它是什麼樣子。

Setting up a REST API in Python for DynamoDB

我的第一個作品必須是我最喜歡的 RPG(角色扮演)遊戲 - 《巫師 3》。我將為評分添加一個新屬性,這將是我的 9.8 分:)

設定 API

對了,現在是時候編寫一些 Python 程式碼來在沒有 GUI 的情況下完成所有這些工作了;)

## app.py
from flask import Flask, jsonify, request
import boto3
from boto3.dynamodb.conditions import Key
import uuid  # Import uuid module for generating UUIDs

app = Flask(__name__)

# Initialize DynamoDB client
dynamodb = boto3.resource('dynamodb', region_name='ap-south-1')  # Replace with your region
## Do keep in mind to save your AWS credentials file in the root directory
table = dynamodb.Table('games')  # Replace with your table name

# Route to get all games
@app.route('/games', methods=['GET'])
def get_games():
    try:
        response = table.scan()
        games = response.get('Items', [])
        return jsonify({'games': games}), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)

Python 的美妙之處在於您只需幾行程式碼即可設定完整的 API。現在,這段程式碼足以讓我們存取該表並從中獲取資料。我們使用掃描功能從遊戲桌上取得項目。

您可以使用 python3 app.py 啟動應用程式

Setting up a REST API in Python for DynamoDB

當您捲曲 /games 端點時,您可以期待如下所示的回應。

建立和更新條目的路由

## app.py
from flask import Flask, jsonify, request
import boto3
from boto3.dynamodb.conditions import Key
import uuid  # Import uuid module for generating UUIDs

app = Flask(__name__)

# Initialize DynamoDB client
dynamodb = boto3.resource('dynamodb', region_name='ap-south-1')  # Replace with your region
## Do keep in mind to save your AWS credentials file in the root directory
table = dynamodb.Table('games')  # Replace with your table name

# Route to get all games
@app.route('/games', methods=['GET'])
def get_games():
    try:
        response = table.scan()
        games = response.get('Items', [])
        return jsonify({'games': games}), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

if __name__ == '__main__':
    app.run(debug=True)

在這裡,我們使用 put_item 將項目新增到表中。為了更新記錄,我們使用函數 update_item。

如果您仔細觀察,我們正在使用 UpdateExpression 來指定要更新的屬性。這使我們能夠準確控制哪個屬性被更改並避免意外覆蓋。

Setting up a REST API in Python for DynamoDB

要刪除記錄,您可以使用類似的操作 -

# Route to create a new game
@app.route('/games', methods=['POST'])
def create_game():
    try:
        game_data = request.get_json()
        name = game_data.get('name')
        rating = game_data.get('rating')
        hours = game_data.get('hours', 0)

        # Generate a random UUID for the new game
        id = str(uuid.uuid4())

        if not name or not rating:
            return jsonify({'error': 'Missing required fields'}), 400

        # Store the game in DynamoDB
        table.put_item(Item={'id': id, 'name': name, 'rating': rating, 'hours': hours})

        # Return the created game with the generated UUID
        created_game = {'id': id, 'name': name, 'rating': rating}
        return jsonify({'message': 'Game added successfully', 'game': created_game}), 201
    except Exception as e:
        return jsonify({'error': str(e)}), 500

# Route to update an existing game
@app.route('/games/<int:id>', methods=['PUT'])
def update_game(id):
    try:
        game_data = request.get_json()
        name = game_data.get('name')
        rating = game_data.get('rating')
        hours = game_data.get('hours', 0)

        if not name and not rating:
            return jsonify({'error': 'Nothing to update'}), 400

        update_expression = 'SET '
        expression_attribute_values = {}

        if name:
            update_expression += ' #n = :n,'
            expression_attribute_values[':n'] = name
        if rating:
            update_expression += ' #r = :r,'
            expression_attribute_values[':r'] = rating
        if hours:
            update_expression += ' #h = :h,'
            expression_attribute_values[':h'] = hours

        update_expression = update_expression[:-1]  # remove trailing comma
        response = table.update_item(
            Key={'id': id},
            UpdateExpression=update_expression,
            ExpressionAttributeNames={'#n': 'name', '#r': 'rating', '#h': 'hours'},
            ExpressionAttributeValues=expression_attribute_values,
            ReturnValues='UPDATED_NEW'
        )
        updated_game = response.get('Attributes', {})
        return jsonify(updated_game), 200
    except Exception as e:
        return jsonify({'error': str(e)}), 500

好了,你已經完成了,借助 Python,您只需幾分鐘即可為 DynamoDB 設定具有 CRUD 功能的 REST API。

以上是在 Python 中為 DynamoDB 設定 REST API的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn