Django のアプリ開発
ノート:
このレガシー ドキュメントは古く、その後更新されません。詳細は開発者ガイドの概要を参照してください。
このチュートリアルでは、TiDB と Django に基づいて単純な Python アプリケーションを構築する方法を示します。ここで構築するサンプル アプリケーションは、顧客情報と注文情報を追加、クエリ、および更新できるシンプルな CRM ツールです。
ステップ 1. TiDB クラスターを開始する
ローカルstorageで疑似 TiDB クラスターを開始します。
docker run -p 127.0.0.1:$LOCAL_PORT:4000 pingcap/tidb:v5.1.0
上記のコマンドは、モック TiKV を使用して一時的な単一ノード クラスターを開始します。クラスタはポート$LOCAL_PORT
でリッスンします。クラスターが停止すると、データベースに対して既に行われた変更は保持されません。
ノート:
本番用の「実際の」TiDB クラスターをデプロイするには、次のガイドを参照してください。
TiDB Cloudを使用する 、TiDB のフルマネージド Database-as-a-Service (DBaaS) も可能です。
ステップ 2. データベースを作成する
SQL シェルで、アプリケーションが使用する
django
データベースを作成します。CREATE DATABASE django;アプリケーションの SQL ユーザーを作成します。
CREATE USER <username> IDENTIFIED BY <password>;ユーザー名とパスワードをメモします。プロジェクトを初期化するときに、アプリケーション コードでそれらを使用します。
作成した SQL ユーザーに必要な権限を付与します。
GRANT ALL ON django.* TO <username>;
ステップ 3. 仮想環境を設定してプロジェクトを初期化する
Python の依存関係およびパッケージ マネージャーである詩使用して、仮想環境を設定し、プロジェクトを初期化します。
詩は、システムの依存関係を他の依存関係から分離し、依存関係の汚染を回避できます。次のコマンドを使用して、Poetry をインストールします。
pip install --user poetryPoetry を使用して開発環境を初期化します。
poetry init --no-interaction --dependency django poetry run django-admin startproject tidb_example mv pyproject.toml ./tidb_example cd tidb_example poetry add django-tidb poetry shell構成ファイルを変更します。
tidb_example/settings.py
の構成は以下の通りです。USE_TZ = True DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'上記の構成を次のように変更します。これは TiDB への接続に使用されます。
USE_TZ = False DATABASES = { 'default': { 'ENGINE': 'django_tidb', 'NAME': 'django', 'USER': 'root', 'PASSWORD': '', 'HOST': '127.0.0.1', 'PORT': 4000, }, } DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
ステップ 4. アプリケーション ロジックを記述する
アプリケーションのデータベース接続を構成したら、アプリケーションの構築を開始できます。アプリケーション ロジックを記述するには、モデルを構築し、コントローラーを構築し、URL ルートを定義する必要があります。
models.py
というファイルで定義されているモデルを構築します。以下のサンプル コードをコピーして、新しいファイルに貼り付けることができます。from django.db import models class Orders(models.Model): id = models.AutoField(primary_key=True) username = models.CharField(max_length=250) price = models.FloatField()views.py
というファイルにクラスベースのビューを作成します。以下のサンプル コードをコピーして、新しいファイルに貼り付けることができます。from django.http import JsonResponse, HttpResponse from django.utils.decorators import method_decorator from django.views.generic import View from django.views.decorators.csrf import csrf_exempt from django.db import Error, OperationalError from django.db.transaction import atomic from functools import wraps import json import sys import time from .models import * def retry_on_exception(view, num_retries=3, on_failure=HttpResponse(status=500), delay_=0.5, backoff_=1.5): @wraps(view) def retry(*args, **kwargs): delay = delay_ for i in range(num_retries): try: return view(*args, **kwargs) except Exception as e: return on_failure return retry
class PingView(View):
def get(self, request, *args, **kwargs):
return HttpResponse("python/django", status=200)
@method_decorator(csrf_exempt, name='dispatch')
class OrderView(View):
def get(self, request, id=None, *args, **kwargs):
if id is None:
orders = list(Orders.objects.values())
else:
orders = list(Orders.objects.filter(id=id).values())
return JsonResponse(orders, safe=False)
@retry_on_exception
@atomic
def post(self, request, *args, **kwargs):
form_data = json.loads(request.body.decode())
username = form_data['username']
price = form_data['price']
c = Orders(username=username, price=price)
c.save()
return HttpResponse(status=200)
@retry_on_exception
@atomic
def delete(self, request, id=None, *args, **kwargs):
if id is None:
return HttpResponse(status=404)
Orders.objects.filter(id=id).delete()
return HttpResponse(status=200)
```
urls.py
というファイルで URL ルートを定義します。 Django プロジェクトの作成時にdjango-admin
コマンドライン ツールがこのファイルを生成したため、このファイルはtidb_example/tidb_example
に既に存在しているはずです。以下のサンプル コードをコピーして、既存のurls.py
ファイルに貼り付けることができます。from django.contrib import admin from django.urls import path from django.conf.urls import url from .views import OrderView, PingView urlpatterns = [ path('admin/', admin.site.urls), url('ping/', PingView.as_view()), url('order/', OrderView.as_view(), name='order'), url('order/<int:id>/', OrderView.as_view(), name='order'), ]
ステップ 5. Django アプリケーションをセットアップして実行する
tidb_example
番上のディレクトリで、 manage.py
スクリプトを使用して、アプリケーションのデータベースを初期化するDjango の移行を作成します。
python manage.py makemigrations tidb_example
python manage.py migrate tidb_example
python manage.py migrate
次に、アプリケーションを開始します。
python3 manage.py runserver 0.0.0.0:8000
サンプル データを挿入してアプリケーションをテストするには、次のコマンドを実行します。
curl --request POST '127.0.0.1:8000/order/' \
--data-raw '{
"uid": 1,
"price": 3.12
}'
curl --request PATCH '127.0.0.1:8000/order/' --data-raw '{ "oid": 1, "price": 312 }'
curl --request GET '127.0.0.1:8000/order/' --data-raw '{ "oid": 1 }'
データの挿入が成功したかどうかを確認するには、SQL シェルでターミナルを開いて確認します。
MySQL root@127.0.0.1:(none)> select * from django.tidb_example_orders;
+-----+-----+-------+
| oid | uid | price |
+-----+-----+-------+
| 1 | 1 | 312.0 |
+-----+-----+-------+
1 row in set
Time: 0.008s
上記の結果は、データの挿入が成功したことを示しています。次に、挿入されたデータを削除できます。
curl --request DELETE '127.0.0.1:8000/order/' --data-raw '{ "oid": 1 }'