森高千里データベースの再構築(4) : hkob の雑記録 (203)

はじめに

hkob の雑記録の第203回目は、昨日追加した曲データベースのリレーションの設定をしてみます。

リレーションプロパティの追加

Lyrics, Musics のプロパティを増やすために、既存の Lyrics, Musics の名前は LyricsStr, MusicsStr に変更しておきました。

Lyrics, Musics の名前変更

ここで、新しいプロパティで Lyrics を追加します。昨日も書いたように多対多の接続のため、無制限のままにします。

Lyrics リレーションを追加

同様に Musics も追加します。

Musics リレーションを追加

結果として以下のようになりました。

リレーション追加後

Notion API で people データを準備

あとは、LyricsStr に書かれてる文字列から Lyrics の値が設定できればいいだけです。irb で確認してみます。まず、NotionRubyMapping を使えるようにします。

require "notion_ruby_mapping"
=> true
irb(main):002> include NotionRubyMapping
=> Object
irb(main):003> NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] }
=> "secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

まず、People データベースを読み込みます。

people_db = Database.find "https://www.notion.so/hkob/234d8e4e98ab807ab739fc65d7c36c2c?v=234d8e4e98ab816f87d9000c31a7c656&source=copy_link"
=> NotionRubyMapping::Database-234d8e4e98ab807ab739fc65d7c36c2c
people = people_db.query_database
=> NotionRubyMapping::List-

タイトルから id を取得する hash を作成してみます。

people_id_hash = people.each_with_object({}) { |person, h| h[person.title] = person.id }
=>
{"和田アキ子"=>"234d8e4e98ab811dbb9fda6c90a9274f",
...

Lyrics を LyricsStr から設定

まず、Songs データベースを読み込み、それぞれのプロパティを取得します。

songs_db = Database.find "https://www.notion.so/hkob/235d8e4e98ab80d1a29adfc13458a29d?v=235d8e4e98ab8184bab2000c7967dc16&source=copy_link"
=> NotionRubyMapping::Database-235d8e4e98ab80d1a29adfc13458a29d
lp = songs_db.properties["Lyrics"]
=>
#<NotionRubyMapping::RelationProperty:0x000000012a19a2a0
...

まず、Lyrics が空の曲一覧を取得します。途中でエラーが出た時に続きから実行できるようにするためです。

songs = songs_db.query_database(lp.filter_is_empty)
=> NotionRubyMapping::List-

あとは先ほど作成した hash を使って設定しまくるだけです。

songs.each do |page|
  sp = page.properties
  str = sp["LyricsStr"].full_text
  ids = str.split(", ").map { |k| people_id_hash[k] }
  sp["Lyrics"].relation = ids
  p [page.title, str]
  page.save
end
["渡良瀬橋", "森高千里"]
["私はおんち", "森高千里"]
["私の夏", "森高千里"]
["私のように", "森高千里"]
["私の大事な人", "森高千里"]
["私がオバさんになっても", "森高千里"]
["私が変?", "鈴木エキス"]
["忘れ物", "森高千里"]
(以下続く)

少し時間はかかりますが、無事に設定が終わりました。

Lyrics 設定後

Musics を MusicsStr から設定

あとは Lyrics と同様に Musics でも実行するだけです。

mp = songs_db.properties["Musics"]
=>
#<NotionRubyMapping::RelationProperty:0x000000012a19d4a0
...
songs_db.query_database(mp.filter_is_empty).each do |page|
  sp = page.properties
  str = sp["MusicsStr"].full_text
  ids = str.split(", ").map { |k| people_id_hash[k] }
  sp["Musics"].relation = ids
  p [page.title, str]
  page.save
end
["MC 私の「普通の幸せ」ベスト5", ""]
["渡良瀬橋", "斉藤英夫"]
["私はおんち", "高橋諭一"]
["私の夏", "斉藤英夫"]
["私のように", "河野伸"]
["私の大事な人", "森高千里"]
["私がオバさんになっても", "斉藤英夫"]
(以下続く)

最後に必要なくなった LyricsStr と MusicsStr のプロパティを削除して、以下のようになりました。CSV インポートでここまで来ることを予定していたのですが、当てが外れました。

Musics 設定後

おわりに

このくらいの自動化をするには NotionRubyMapping は非常に楽ですね。作った甲斐があります。

hkob.notion.site