database.rename_property, remove_properties: NotionRubyMapping 解説 (32)

はじめに

NotionRubyMapping 解説の第32回目です。今日からデータベースのプロパティの設定を解説します。Notion API では Property Object や Property Schema Object などの JSON が必要となりますが、NotionRubyMapping ではそのあたりは内部に隠蔽しているので、それらの知識は必要としません。ページはこちらに用意しました。明日以降も使えるように同期ブロックの中にデータベースを入れてあります。明日以降のページにもこの同期ブロックを入れておきます。

database.rename_property, remove_properties (32)

Database (変更前)

今日はページではなく、中のデータベースを取得します。データベースをフルページで開き、その URL を使ってデータベースを取得します。

irb(main):002> db = Database.find "https://www.notion.so/hkob/55bed716d15f408b81d5815be09faf45?v=a120c88f71664a9cbf96827f8042c621&pvs=4"
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45

rename_property

データベースのプロパティの名前を変更するには、rename_property メソッドを利用します。ここでは、名前を Name に、タグを Tag に変更してみます。メソッドだけでは API 呼び出しはされず、その後 save をしたところで初めて API 呼び出しが行われます。

irb(main):003> db.rename_property "名前", "Name"
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
irb(main):004> db.rename_property "タグ", "Tag"
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
irb(main):005> db.save
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45

実行した結果以下のようにプロパティの名前が書きかわっています。

データベースの名称変更

remove_properties

プロパティを削除するには remove_properties メソッドを使います。複数形になっていることからわかるように、 db.remove_properties "A", "B" のように複数のプロパティを一気に削除することができます。今回は、Tag プロパティを消してみます。

db.remove_properties "Tag"
=>
[#<NotionRubyMapping::MultiSelectProperty:0x000000010e25d8e8
  @base_type=:database,
  @create=false,
  @json={"options"=>[]},
  @name="Tag",
  @new_name=nil,
  @property_cache=PropertyCache,
  @property_id="BUEV",
  @query=nil,
  @remove=true,
  @will_update=true>]

ここで、save をしてみましたが、以下のようなエラーになりました。

irb(main):009> db.save
/Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:162:in `rescue in update': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"名前 is not a valid property schema", "request_id"=>"f91a01fc-b0ec-465e-b9d3-f2b39466a3ae"} by {"properties"=>{"名前"=>{"name"=>"Name"}, "タグ"=>{"name"=>"Tag"}, "Tag"=>nil}} (StandardError)
  from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:159:in `update'
  from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:319:in `save'
    from (irb):9:in `<main>'
  from <internal:kernel>:187:in `loop'
  from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.1/exe/irb:9:in `<top (required)>'
    from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `load'
  from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `<main>'
/Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:345:in `update_json': {"object"=>"error", "status"=>400, "code"=>"validation_error", "message"=>"名前 is not a valid property schema", "request_id"=>"f91a01fc-b0ec-465e-b9d3-f2b39466a3ae"} (StandardError)
    from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/database.rb:160:in `update'
  from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/notion_ruby_mapping-0.8.3/lib/notion_ruby_mapping/blocks/base.rb:319:in `save'
  from (irb):9:in `<main>'
    from <internal:kernel>:187:in `loop'
  from /Users/hkob/.rbenv/versions/3.3.0/lib/ruby/gems/3.3.0/gems/irb-1.11.1/exe/irb:9:in `<top (required)>'
  from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `load'
    from /Users/hkob/.rbenv/versions/3.3.0/bin/irb:25:in `<main>'

Notion API に送っている JSON を確認したところ、先ほどの Rename の呼び出しのための Payload が残ってしまっていました。

irb(main):011> print db.save dry_run: true
#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/databases/55bed716d15f408b81d5815be09faf45' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"properties":{"名前":{"name":"Name"},"タグ":{"name":"Tag"},"Tag":null}}'=> nil

一度、NotionCache をクリアしてから、再度 database を取り出して削除してみたところ、無事にプロパティが削除されました。この辺りは連続しても処理が続けられるようにコードを修正していきたいと思います。

irb(main):019> NotionCache.instance.clear_object_hash
=> {}
irb(main):020> db = Database.find "https://www.notion.so/hkob/55bed716d15f408b81
d5815be09faf45?v=a120c88f71664a9cbf96827f8042c621&pvs=4"
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45
irb(main):021> db.remove_properties "Tag"
=>
[#<NotionRubyMapping::MultiSelectProperty:0x000000010e25faa8
  @base_type=:database,
  @create=false,
  @json={"options"=>[]},
  @name="Tag",
  @new_name=nil,
  @property_cache=PropertyCache,
  @property_id="BUEV",
  @query=nil,
  @remove=true,
  @will_update=true>]
irb(main):022> db.save
=> NotionRubyMapping::Database-55bed716d15f408b81d5815be09faf45

この処理によって Tag が削除されました。

プロパティの削除後

おわりに

今回は、プロパティの名称変更と削除を解説しました。明日はタグを追加する add_property を解説します。

rename_property と remove_properties のマニュアルはこちらです。

rename_property(old_property_name, new_property_name) → [Database](https://www.notion.so/Database-1462b24502424539a4231bedc07dc2f5?pvs=21)

remove_properties(*property_names) → Array

NotionRubyMapping解説