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

はじめに

hkob の雑記録の第209回目は、Concerts と ConcertHalls を繋ぐ Performances を追加します。

ER図

Performances は Concerts, ConcertHalls に接続します。今のデータベースでは繋がっていませんが、Date property があるので、Year にも接続したいですね。これも追加しておきます。ただ、Year も Date が存在するところに全部繋がるので、図的にはグチャグチャしてきます。こちらもリレーションの接続線だけは省略していいかもしれません。

ER図

Performances のエクスポート

Performances は以下のプロパティをエクスポートすることにします。

Performances のプロパティ

作成した CSV ビューはこんな感じです。今回、修正したいのは Name が 01, 02 のように無機質なタイトルになっていることです。このことを踏まえてデータベースの移行を進めていきます。

作成した CSV ビュー

前回と同様に CSV に書き出し後、リレーションの URL 削除をしてしまいます。

sed 's/ (https:\/\/www.notion.so[^)]*)//g' Performances\ e8108114ce7b42d6bc146b7247e22fdb.csv | sed 's/\([0-9][0-9]*\)\/\([0-9][0-9]*\)\/\([0-9][0-9]*\)/\1-\2-\3/g' | sed 's/ → /\//g' > Performances.csv

変換結果は以下のようになります。タイトルの部分にコンサート内の通番をタイトル (Name) としていましたが、この部分は Order という数値プロパティにしたいです。このため、Name → Order に変更します。プロパティの名前を変更するのが面倒なので、先に ConcertHall → ConcertHallStr に変更しておきます。また、Title だった Name 属性がなくなってしまったので、これまでの Concert を Name に変更しておきます。Name の部分は後でオートメーションで上書きされてしまうので、プロパティを消す手間も省けます。

Order,Date,Name,ConcertHallStr,Hall info,Product,Live reports,Comments
01,1987-09-07,渋谷ライブイン ファーストライブ,渋谷ライブイン,,,,
01,1987-12-11,"「OVERHEAT. NIGHT」, 「GET SMILE」",大阪厚生年金会館,[中ホール],,,「OVERHEAT. NIGHT」
02,1987-12-17,"「OVERHEAT. NIGHT」, 「GET SMILE」",日本青年館,,,,「GET SMILE」<ビデオ収録>
03,1988-03-11,"「OVERHEAT. NIGHT」, 「GET SMILE」",徳島ベガホール,,,,「GET SMILE」

Performances の作成 & インポート

森高千里DBの下に作成したいので、また Cmd-Opt-9 で新規ページを作成します。この新規ページを開き、インポートを実施しました。

CSV 列の設定

インポートを実行しました。

インポート完了

リレーションの作成

Concert と ConcertHall リレーションを追加します。どちらも1対多の関係となります。このため、1ページ制限を付加しています。また双方向リレーションも追加します。

Concert リレーション

ConcertHall リレーション

Year, Map リレーション追加と Year 自動設定の追加

いつものように Year, Map リレーションを追加し、Map 自動追加、Year 自動追加のオートメーションを設定します。同じことの繰り返しになるので、ここは説明を省略します。

二つのオートメーション

Notion API で Concert, ConcertHall データを準備

これまでと同様に Name から Concert, ConcertHallStr から ConcertHall を設定してみます。concert_id_hash, concert_hall_id_hash まではこれまでと同様です。

concerts_db = Database.find "https://www.notion.so/hkob/239d8e4e98ab806186e0e6e9a36b14ff?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link"
=> NotionRubyMapping::Database-239d8e4e98ab806186e0e6e9a36b14ff
concerts = concerts_db.query_database
=> NotionRubyMapping::List-
concerts_id_hash = concerts.each_with_object({}) { |c, h| h[c.properties["Name"].full_text] = c.id }
=>
{"森高千里 Autumn Tour 2014 ~LOVE~"=>"239d8e4e98ab81099f72de9154e3331e",
...
concert_halls_db = Database.find "https://www.notion.so/hkob/23ad8e4e98ab800685edf986f1cb15c2?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link"
=> NotionRubyMapping::Database-23ad8e4e98ab800685edf986f1cb15c2
concert_halls = concert_halls_db.query_database
=> NotionRubyMapping::List-
concert_halls_id_hash = concert_halls.each_with_object({}) { |ch, h| h[ch.properties["Name"].full_text] = ch.id }
=>
{"大阪 IMP ホール"=>"23ad8e4e98ab81789cd9d725278f8c3e",
...

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

performances_db = Database.find "https://www.notion.so/hkob/23cd8e4e98ab8049a856c05ad8eac93a?v=231d8e4e98ab80d99376000c19fe73ed&source=copy_link"
=> NotionRubyMapping::Database-23cd8e4e98ab8049a856c05ad8eac93a
pc = performances_db.properties["Concert"]
=>
#<NotionRubyMapping::RelationProperty:0x0000000123abf148
...
pch = performances_db.properties["ConcertHall"]
=>
#<NotionRubyMapping::RelationProperty:0x00000001238999e0
...

さらに Prefecture が空のコンサートホール一覧を取得します。途中でエラーが出た時に続きから実行できるようにするためです。

performances = performances_db.query_database(pc.filter_is_empty)
=> NotionRubyMapping::List-

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

performances.each do |performance|
  pp = performance.properties
  concert_str = pp["Name"].full_text
  pp["Concert"].relation = [concerts_id_hash[concert_str]]
  concert_hall_str = pp["ConcertHallStr"].full_text
  pp["ConcertHall"].relation = [concert_halls_id_hash[concert_hall_str]]
  p [concert_str, concert_hall_str]
  performance.save
end
["ハタチのシャ乱Qみんなでお祝いだ!日本武道館フェスィバル~長いよ~", "日本武道館"]
["さい帯血バンク支援コンサートPacific Heaven", "横浜アリーナ"]
["さい帯血バンク支援コンサートPacific Heaven", "名古屋レインボーホール"]
["「サバサバ」ツアー", "東京国際フォーラム"]
["「サバサバ」ツアー", "東京国際フォーラム"]
["「サバサバ」ツアー", "名古屋センチュリーホール"]
["「サバサバ」ツアー", "名古屋センチュリーホール"]
["「サバサバ」ツアー", "神戸国際会館ハーバーランドプラザ"]
(後略)

これで無事に Concert, concertHall, Year リレーションが設定されました。

設定されたリレーション群

Notion API の設定後にオートメーションが追っかけて変更されるのが面白かったので、動画を撮って X にポストしてみました。

現在存在する全てのページの Year が設定できたので、オートメーションのトリガを Date が設定された時に変更しました。

オートメーションのトリガ修正

タイトルの自動設定

これまでタイトルは 01, 02 のような数値だけになつていました。今回、この情報は Order という数値プロパティに移動しました。そこで、この Order, Concert および ConcertHall から Name を自動設定するデータベースオートメーションを作成します。

Name 設定のオートメーション

ここで設定した値は以下のように設定しました。

Name 文字列の作成数式

オートメーションは以下のように3つ設定されました。

3つのオートメーション

オートメーションの確認

試しに最初の一つだけタイトルの文字列を消してみたところ、想定通りのタイトルが設定されました。

最初の一件だけテスト

あとは全てのタイトルを削除したところ、一気にタイトルが自動設定されました。

全ページの一括修正後

おわりに

今回、私が一番やりたかったタイトルの自動設定がかなりいい感じで動作しました。番号と会場を選択するだけで、タイトルが綺麗に整形されるので非常にみやすくなりました。

hkob.notion.site