Getting Started — FastAPIおよびPydanticを使用したOracle NoSQL Databaseへのアクセス (2024/04/23)

Getting Started — FastAPIおよびPydanticを使用したOracle NoSQL Databaseへのアクセス (2024/04/23)

https://medium.com/oracledevs/getting-started-accessing-oracle-nosql-database-using-fastapi-and-pydantic-52b627759d51

投稿者:Dario Vega


アプリケーションでFastAPIフレームワークを使用して、Oracle NoSQL Database Cloud Serviceのデータを管理しましょう。


サンプル・アプリケーションは、Oracle NoSQL Database Python SDKのborneoを使用して、NoSQL Databaseのレコードを格納、取得、更新、問合せおよび削除する方法を示します。


可用性の高いエラスティック・スケーリング・ストアで、Pythonアプリケーションで予測可能な1桁ミリ秒のレスポンス時間を大規模にデータにアクセスしますか。アプリケーションをオンプレミスとクラウドの間ですぐに移行できるようにしますか?次に、これらの謎を解くための15分間のチュートリアルに取り組みましょう。



Oracle NoSQL Database Python SDKの使用



FastAPIの理解


FastAPIは、標準のPython型のヒントに基づいてPython 3.8以上でAPIを構築するための、最新の高速(高パフォーマンス)なWebフレームワークです。FlaskやDjangoなどのPythonを使用してAPIを構築するマイクロフレームワークは数多くありますが、FastAPIはパフォーマンスと構築が容易なアプローチにより、開発コミュニティに大きな勢いを見出しています。FastAPIは、他のフレームワークからインスピレーションを得て、他の代替フレームワークとどのように比較し、そのフレームワークから学習したかを確認します。



Pydanticでデータを検証


Pydanticは、Pythonで最も広く使用されているデータ検証ライブラリです。速く、拡張可能、Pydanticはあなたのlinters/IDE/brainとうまく遊びます。データを純粋で正規のPython 3.8+でどのようにするかを定義し、Pydanticで検証します。


# Pydantic model for item data
class Image(BaseModel):
#url: str
url: HttpUrl
name: str


class Item(BaseModel):
__tablename__ = "fapi_items"
item_id: int
name: str
tags: Set[str] = set()
images: Union[List[Image], None] = None


Pydanticは、複数の方法でモデルをシリアライズする機能を提供します。


  • model_dump: モデルのディクショナリ表現を生成します。オプションで、含めるフィールドまたは除外するフィールドを指定します。
  • model_dump_json: Pydanticのto_jsonメソッドを使用して、モデルのJSON表現を生成します。
  • parse_obj: これは、モデルの__init__メソッドと非常によく似ていますが、キーワード引数ではなくdictを取ります。渡されたオブジェクトが辞書でない場合は、ValidationErrorが発生します。


これらの関数を使用して、Oracle NoSQL Databaseに格納されている命令に対してオブジェクトを変換します。


def put(item: Item):
request = PutRequest().set_table_name(tableName)
# In this case we will use model_dump_json instead of model_dump
# because we are using Set and HttpUrl
# request.set_value(item.model_dump());
request.set_value_from_json(item.model_dump_json());
result = handle.put(request)
def get_item(item_id: int):
request = GetRequest().set_key({key: item_id}).set_table_name(tableName)
result = handle.get(request)
return (Item.parse_obj(result.get_value()))


Oracle NoSQL Databaseのデータ・モデル


データの適切なモデリングは、アプリケーションのパフォーマンス、拡張性、アプリケーションの正確性、そして最後に、豊富なユーザー・エクスペリエンスをサポートするアプリケーションの機能にとって重要です。


純粋に固定されたスキーマを持つリレーショナル・データベースの世界とは異なり、NoSQLデータベースは、主にスキーマの柔軟性に関するもので、データの編成および格納方法を簡単に変更する機能です。


Oracle NoSQL Database 23.3以上では、JSONコレクション表がサポートされています。これは、ドキュメントとしてのみデータを格納および取得するアプリケーションに特に役立ちます。JSONコレクション表は、ドキュメントの管理と操作を簡素化するために作成されます。JSONコレクション表を使用すると、表の作成時にフィールドをJSON型として宣言する必要がなくなります。表にデータを挿入すると、各行は任意の数のJSONフィールドを含む単一のドキュメントとして挿入されます。


CREATE TABLE if NOT EXISTS fapi_items(
item_id LONG, PRMIARY KEY(item_id)
) AS JSON COLLECTION


また、すでにpydanticを使用して、アプリケーションのデータを検証しています。



Oracle NoSQL DatabaseのSQL


SQL for Oracle NoSQL Databaseへようこそ。この問合せ言語は、Oracle NoSQL Database SDKから使用できる統計を提供します。Oracle NoSQL DatabaseのSQLデータ・モデルは、フラットなリレーショナル・データ、階層型(スキーマフル)データ、スキーマレスJSONデータをサポートしています。SQL for Oracle NoSQL Databaseは、このようなすべてのデータを、さまざまなサブモデル間で「インピーダンスの不一致」なしにシームレスに処理するように設計されています。


def get_items(page: int = 0, limit: int = 10, orderby: str = "item_id", where: str = "" ):
statement = ("SELECT * FROM {table} {where} ORDER BY {orderby} LIMIT {limit} OFFSET {offset}").format(table=tableName,where=where,orderby=orderby,limit=limit,offset=limit*page)
request = QueryRequest().set_statement(statement)
qiresult = handle.query_iterable(request)
items = list()
for row in qiresult:
items.append(Item.parse_obj(row))
return items


15分、そして


  • Python 3.8以上
  • UvicornやHypercornなどの本番用のASGIサーバー
  • Oracle NoSQL Database (このデモでは、NoSQL KVLite - CE 23.3のコンテナ・イメージを使用します)
  • curl


Step1.Oracle NoSQL Database KVLite CE 23.3を使用したコンテナ・イメージの起動


docker pull ghcr.io/oracle/nosql:latest-ce
docker tag ghcr.io/oracle/nosql:latest-ce oracle/nosql:ce
docker run -d --name=kvlite --hostname=kvlite --env KV_PROXY_PORT=8080 \
-p 8080:8080 oracle/nosql:ce


ステップ2.Githubのoracle/nosql-examplesリポジトリをクローニングするか、fastapi-oracle-nosql-example.zipファイルのみを取得


# Clone the Github repository
# git clone https://github.com/oracle/nosql-examples.git
# cd nosql-examples

# Use the fastapi-oracle-nosql-example.zip file from the GitHub Repository
curl -L https://github.com/oracle/nosql-examples/raw/master/zips/fastapi-oracle-nosql-example.zip -o fastapi-oracle-nosql-example.zip
unzip fastapi-oracle-nosql-example.zip
rm -f fastapi-oracle-nosql-example.zip

cd examples-nosql-python-sdk/fastapi-oracle-nosql-example


ステップ3.pipを使用して必要なパッケージをインストール


$ python3 -V
Python 3.8.14

$
cat requirements.txt
fastapi[all]
oci
borneo
uvicorn
pydantic

$
python3 -m pip install -r requirements.txt


ステップ4.FastAPIアプリ・コードを確認


$ cat myfapi.py


ステップ5.FastAPIアプリケーションの実行


$ uvicorn myfapi:app --host 0.0.0.0 --port 8000 --reload


ステップ6.APIエンドポイントのテスト


FastAPIアプリケーションを使用するには、http://localhost:8000/docsの「試してみる」ボタンを使用するか、curlなどのコマンドライン・ツールを使用します。


  • POST: データの作成


curl -X 'POST' \
'http://localhost:8000/items/' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"item_id":1,
"name": "Foo",
"tags": [
"rock",
"metal",
"metal",
"bar"
],
"images": [
{
"url": "http://example.com/baz.jpg",
"name": "The Foo live"
},
{
"url": "http://example.com/dave.jpg",
"name": "The Baz"
}
]
}'


  • GET: データの取得


curl -X 'GET' \
'http://localhost:8000/items/1' \
-H 'accept: application/json'
curl -X 'GET' \
'http://localhost:8000/items/?page=0&limit=10' \
-H 'accept: application/json'


  • PUT: データの更新


curl -X 'PUT' \
'http://localhost:8000/items/1' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"item_id":1,
"name": "Foo",
"tags": [
"rock",
"metal",
"bar"
],
"images": [
{
"url": "http://example.com/baz23.jpg",
"name": "The Foo live"
},
{
"url": "http://example.com/dave23.jpg",
"name": "The Baz"
}
]
}'


  • DELETE: データの削除


curl -X 'DELETE' \
'http://localhost:8000/items/1'


Oracle開発者とOracle OCI Free Tier


SlackのOracle Developersチャネルに参加して、このトピックやその他のトピックについて説明します。


Oracle Cloudでアプリケーションを無料で構築、テスト、デプロイできます。OCI Cloud Free Tierにアクセスしましょう。


コメント

このブログの人気の投稿

Oracle RACによるメンテナンスのためのドレインとアプリケーション・コンティニュイティの仕組み (2023/11/01)

Oracle Cloud Infrastructure Secure Desktopsを発表: デスクトップ仮想化のためのOracleのクラウドネイティブ・サービス (2023/06/28)

Oracle Cloudのデータベースをオブジェクト・ストレージにバックアップする3つの方法 (2021/12/13)