Simple CRUD - ATOM編

本チュートリアルでは、Docs » チュートリアル » Simple CRUD - シナリオ編で作成したものと同じ内容をATOMで開発します。

Warning

シナリオ編で作成したEmploymentデータモデルをCRUDするアプリケーションを作成するため、シナリオ編で作成したScenarioModelが残っている場合は必ず削除してから本チュートリアルを実施してください。


Step1. ATOMを作成する

ATOMを作成しましょう。以下の定義でATOMを作成してください。
ATOMは、データモデルとAPIを自動生成できます。

Note

自動生成されるAPIの本文構造にATOMクラス名がキーとして挿入される点に特徴があります。本文構造を自由に規定したい場合は、ATOMからのAPI自動生成をオフにしてシナリオでAPIを規定してシナリオのコマンド内でATOMをCRUDすると良いでしょう。

category: Tutorial
name: Employment
persistence: true
api_generation: true
api_basepath: /tutorials
abstract: false
attributes:
  identifier:
    field_name: entryNumber
    field_type: string
    field_persistence: true
    field_immutable: true
    field_metadata:
      POST: false
  local_fields:
    - field_name: firstName
      field_type: string
      field_persistence: true
      field_nullable: true
      field_immutable: false
      field_unique: false
      field_format: '[a-zA-Z]'
      field_metadata:
        POST: true
        PUT: true
    - field_name: lastName
      field_type: string
      field_persistence: true
      field_nullable: true
      field_immutable: false
      field_unique: false
      field_format: '[a-zA-Z]'
      field_metadata:
        POST: true
        PUT: true
    - field_name: email
      field_type: string
      field_persistence: true
      field_nullable: true
      field_immutable: false
      field_unique: true
      field_format: '^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$'
      field_metadata:
        POST: true
        PUT: true
    - field_name: salaryRequirements
      field_type: integer
      field_persistence: true
      field_nullable: true
      field_immutable: false
      field_unique: false
      field_metadata:
        POST: true
        PUT: true
  ref_fields: []
methods:
  class_methods: []
  instance_methods:
    - method_body: |-
        async def initialize(self, *args, **kwargs):
            if not self.entryNumber:
                self.entryNumber = await Counter.allocate("entryNumber")
      propagation_mode: true
      topdown: true
      auto_rollback: true
      multiplexable_number: 1
      field_order: ascend


ATOMを作成するとEmploymentデータモデル、ATOMクラス、APIがすべて自動的に生成されています。 生成されたATOMを操作してみましょう。

>>> amuroray = await atom.Employment(firstName="Ray", lastName="Amuro", email="amuroray@uc.com", salaryRequirements=10000000)↵
... print(amuroray.entryNumber)↵
... ↵
E0007↵
↵
>>> await amuroray.save()↵
... ↵
... employments = await atom.Employment.retrieve()↵
... print(employments)↵
... ↵
[Employment(instance='RW1wbG95bWVudDo1NjAzMzZkNDY2MzExMWU5ODBmMTAwMGMyOWRkODI1MA==', xid=None, xname=None, entryNumber='E0007', firstName='Ray', lastName='Amuro', email='amuroray@uc.com', salaryRequirements=10000000)]↵
↵
>>> await employments[0].save(email="updated@gmail.com")↵
... ↵
... amuroray = await atom.Employment.load("E0007")↵
... print(amuroray.email)↵
... ↵
updated@gmail.com↵
↵
>>> await amuroray.destroy()↵
... ↵
... employments = await atom.Employment.retrieve()↵
... print(employments)↵
... ↵
[]↵
↵


最後にcallout組込みオブジェクトを使って生成されたAPIをテストしてみましょう。

>>> r = await callout(path="/tutorials/employments", method="POST", body=dict(Employment=dict(firstName="Ray", lastName="Amuro", email="amuroray@uc.com", salaryRequirements=10000000)))↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
{
    "Employment": {
        "instance": "RW1wbG95bWVudDpjNDFjMWZiMjY2MzMxMWU5ODBmMTAwMGMyOWRkODI1MA==",
        "entryNumber": "E0008",
        "firstName": "Ray",
        "lastName": "Amuro",
        "email": "amuroray@uc.com",
        "salaryRequirements": 10000000
    }
}↵
↵`
>>> r = await callout(path="/tutorials/employments?firstName=Ray")↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
[
    {
        "Employment": {
            "instance": "RW1wbG95bWVudDpjNDFjMWZiMjY2MzMxMWU5ODBmMTAwMGMyOWRkODI1MA==",
            "entryNumber": "E0008",
            "firstName": "Ray",
            "lastName": "Amuro",
            "email": "amuroray@uc.com",
            "salaryRequirements": 10000000
        }
    }
]↵
↵
>>> r = await callout(path="/tutorials/employments/E0008", method="PUT", body=dict(Employment=dict(email="updated@gmail.com")))↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
{
    "Employment": {
        "instance": "RW1wbG95bWVudDpjNDFjMWZiMjY2MzMxMWU5ODBmMTAwMGMyOWRkODI1MA==",
        "entryNumber": "E0008",
        "firstName": "Ray",
        "lastName": "Amuro",
        "email": "updated@gmail.com",
        "salaryRequirements": 10000000
    }
}↵
↵
>>> r = await callout(path="/tutorials/employments/E0008", method="DELETE")↵
... print(r.code)↵
... ↵
204↵
↵
>>> r = await callout(path="/tutorials/employments")↵
... print(json.dumps(json.loads(r.body), indent=4))↵
... ↵
[]↵
↵


以上でSimple CRUD - ATOM編のチュートリアルは完了です。シナリオ編で紹介したModelを作成する方法では、データベーススキーマをjsonschemaで定義する作業やデータアクセスのためのSQL文の組み立てなど煩わしく、ATOMを利用することでそれらが簡潔に解決できることを理解できたのではないでしょうか。