データベースの取得と関連するメソッド: NotionRubyMapping 解説 (4)

はじめに

NotionRubyMapping 解説の第4回目です。昨日はページを取得したので、似た部分が多いデータベースを取得してみます。ちょうど機能作った「作業ページデータベース」があるので、これを取得してみます。

データベースの取得

このデータベースの公開 URL は以下のようになります。ここで site のすぐ後ろの32桁の16進数が database_id となります。一方、?v= の後ろはビューの id に相当しますが、現在 Notion API からビューに関して何かできる機能はありません。

https://hkob.notion.site/f50fe9be119c41d1b2e0b99bbab471a8?v=56d3ff0f3fd340e1b7e4bb14cef6202b&pvs=4

NotionRubyMapping では Database クラスの find クラスメソッドで Notion データベースを取得できます。ページの取得と同様に database_id を取り出すのは面倒なので、上のデータベースの URL をそのまま渡しても自動的に database_id を取り出してくれます。ここでは、以下のコマンドでデータベースを取得してみます。database_iddatabase_url は文字列なので、 "" でくくってください。

irb(main):002> db = Database.find "https://hkob.notion.site/f50fe9be119c41d1b2e0
b99bbab471a8?v=56d3ff0f3fd340e1b7e4bb14cef6202b&pvs=4"
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8

NotionRubyMapping::Database のオブジェクトが取得できていることがわかります。

データベースオブジェクトに対するメソッド

ページと同様にここでは代表的なメソッドを紹介してみます。

1. database_title: データベースタイトルを取得

database_title はデータベースのタイトルを取得するメソッドです。page は title でテキストのみが取得できたのですが、こちらは後日解説する予定の RichTextArray が返ってきています。あまり対称性がよくないですね。タイトルに装飾をすることはほとんどないので、こちらもテキストだけでよさそうです。後で修正してしまいたいと思います。

irb(main):004> db.database_title
=>
#<NotionRubyMapping::RichTextArray:0x000000012677b678
 @key="title",
 @rich_text_objects=
  [#<NotionRubyMapping::TextObject:0x0000000126755068
    @options=
     {"plain_text"=>"作業ページデータベース",
      "bold"=>false,
      "italic"=>false,
      "strikethrough"=>false,
      "underline"=>false,
      "code"=>false,
      "color"=>"default",
      "href"=>nil},
    @text="作業ページデータベース",
    @type="text",
    @will_update=false>],
 @will_update=nil>

2. parent_id: 親の ID を取得

parent_id はページの親の ID を取得するメソッドです。

irb(main):005> db.parent_id
=> "e74f18cd-f3bc-464f-b551-7cf7c895cc4a"

3. parent: 親の Notion オブジェクトを取得

parent はページの親のオブジェクトを取得するメソッドです。通常、データベースの親はページか workspace になることがほとんどなのですが、これは Database になっていました。唯一の例外である Wiki データベースですね。通常データベースの中にデータベースを入れることはできないのですが、Wiki データベースだけはデータベースを子供に持つことができます。

irb(main):006> db.parent
=> NotionRubyMapping::Database-e74f18cdf3bc464fb5517cf7c895cc4a

4. created_time: 作成時刻プロパティを取得

created_time はページの作成時刻プロパティを取得するメソッドです。ページでも説明しましたが、inspect が実装されていないので、中身が見えてしまってカッコ悪いです。

irb(main):007> db.created_time
=>
#<NotionRubyMapping::CreatedTimeProperty:0x00000001263d7b20
 @base_type=:page,
 @create=false,
 @json="2024-02-25T11:23:00.000Z",
 @name="__timestamp__",
 @new_name=nil,
 @property_cache=nil,
 @property_id=nil,
 @query=nil,
 @remove=false,
 @will_update=false>
i

5. last_edited_time: 更新時刻プロパティを取得

last_edited_time はページの更新時刻プロパティを取得するメソッドです。こちらも同じです。

irb(main):008> db.last_edited_time
=>
#<NotionRubyMapping::LastEditedTimeProperty:0x0000000120a7d3e0
 @base_type=:page,
 @create=false,
 @json="2024-02-25T11:25:00.000Z",
 @name="__timestamp__",
 @new_name=nil,
 @property_cache=nil,
 @property_id=nil,
 @query=nil,
 @remove=false,
 @will_update=false>

6. page?, database?, block?

page?, database?, block? はそのオブジェクトが page なのか、database なのか、block なのかを聞くメソッドです。今回の場合、database? のみが true を返します。

irb(main):009> db.page?
=> false
irb(main):010> db.database?
=> true
irb(main):011> db.block?
=> false

7. new_record?

new_record? は Rails と同じで Notion 側に存在しない Page オブジェクトである時に true を返すメソッドです。基本的には Database.new で作成したオブジェクトの時 true になります。これは後日解説します。

irb(main):012> db.new_record?
=> nil

8. properties

properties は database のプロパティをまとめて管理する PropertyCache オブジェクトを返します。こちらについては、後日プロパティの解説の時に説明します。ページのプロパティとデータベースのプロパティは Ruby のクラスは同じものですが、扱うものが全く異なります。後日解説します。

irb(main):013> db.properties
=> PropertyCache

9. icon

icon はページアイコンの内容を示すハッシュを返すメソッドです。このページはアイコンがないので、nil になっています。

irb(main):014> db.icon
=> nil

10. set_icon emoji: a_emoji または set_icon url: a_url

set_icon は絵文字または外部 URL によりアイコンを設定するメソッドです。ただし、オブジェクトの設定をするだけで、後述する save をした時に初めて Notion にデータが送られて変更されます。ページと全く同じです。

irb(main):015> db.set_icon emoji: "2️⃣"
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8

11. save または save dry_run: true

ページと同様に save dry_run: true とすると実際に Notion に作業する代わりにスクリプトが表示されます。

irb(main):016> print db.save dry_run: true
#!/bin/sh
curl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"icon":{"type":"emoji","emoji":"2️⃣"}}'=> nil

db.save とすると Notion のページアイコンが変更されました。

irb(main):017> db.save
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8

保存した後、Notion API はページ情報を返却してくれます。NotionRubyMapping では返却された情報で database オブジェクトの内容を再度アップデートします。このため、ここで db.icon とすると変更されたアイコンの情報が正しく入っていることがわかります(先ほど取得した時は nil でした)。

irb(main):018> db.icon
=> {"type"=>"emoji", "emoji"=>"2️⃣"}

12. is_inline, is_inline = flag

データベースのみの特性として is_inline という属性があります。これを true にして保存するとデータベースがインラインに設定されます。

irb(main):021> db.is_inline = true
=> true
irb(main):022> db.save dry_run: true
=> "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \\\n  -H 'Notion-Version: 2022-06-28' \\\n  -H 'Authorization: Bearer '\"$NOTION_API_KEY\"'' \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"is_inline\":true}'"
irb(main):023> db.save
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8
irb(main):024> db.is_inline
=> true

13. description, description = text_info

もう一つデータベースのみの特性は description です。text_info には RichTextArray に相当するものが設定できるのですが、詳細は後日解説します。

irb(main):025> db.description = "データベースの説明"
=> "データベースの説明"
irb(main):026> db.save dry_run: true
=> "#!/bin/sh\ncurl -X PATCH 'https://api.notion.com/v1/databases/f50fe9be119c41d1b2e0b99bbab471a8' \\\n  -H 'Notion-Version: 2022-06-28' \\\n  -H 'Authorization: Bearer '\"$NOTION_API_KEY\"'' \\\n  -H 'Content-Type: application/json' \\\n  --data '{\"description\":[{\"type\":\"text\",\"text\":{\"content\":\"データベースの説明\",\"link\":null},\"plain_text\":\"データベースの説明\",\"href\":null}]}'"
irb(main):027> db.save
=> NotionRubyMapping::Database-f50fe9be119c41d1b2e0b99bbab471a8
irb(main):028> db.description
=>
#<NotionRubyMapping::RichTextArray:0x0000000125e5aff8
 @key="description",
 @rich_text_objects=
  [#<NotionRubyMapping::TextObject:0x0000000126499428
    @options=
     {"plain_text"=>"データベースの説明",
      "bold"=>false,
      "italic"=>false,
      "strikethrough"=>false,
      "underline"=>false,
      "code"=>false,
      "color"=>"default",
      "href"=>nil},
    @text="データベースの説明",
    @type="text",
    @will_update=false>],
 @will_update=false>

おわりに

昨日の記事を見た人は昨日の記事とほとんど同じで手抜きだと思われたかもしれません。実際ほとんどの部分が共通だったと思います。実際にはほとんどのメソッドが Page および Database の共通の親クラスである Base に定義されているためです。明日は同じように Base の子クラスである Block を紹介するつもりですが、こちらはあまり共通部分はありません。

データベースに関するマニュアルはこちら hkob.notion.site

NotionRubyMapping解説