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

はじめに

hkob の雑記録の第207回目は、都道府県 (Prefectures)・コンサートホール (ConcertHalls) のデータベースを追加します。

ER図

昨日、Map については属性のみで ER 図から排除する旨を記載しました。今回の Prefectures と ConcertHalls は、これらには接続しないのでまだ独立しています。

ER 図

Prefectures のエクスポートとインポート

Prefectures は Name, Region, Sort order をエクスポートします。こちらもリレーションがないので、さっさとエクスポートしてインポートしてしまいます。

オリジナルの Prefectures

無事にインポートが終わりました。

インポート後の Prefectures

ConcertHalls のエクスポート

ConcertHalls のプロパティは Name と上の Prefectures へのリレーションのみです。こちらで書き出しを行います。

ConcertHalls のプロパティ選別

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

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

変換結果は以下のようになります。プロパティの名前を変更するのが面倒なので、先に Prefecture → PrefectureStr に変更しておきます。前からそうしておけばよかったです。

Name,PrefectureStr
渋谷ライブイン,東京
日本青年館,東京
徳島ベガホール,徳島
福岡ビブレ,福岡

Concerts の作成 & インポート

森高千里DBの下に作成したいので、また Cmd-Opt-9 で新規ページを作成します。この新規ページを開き、インポートを実施しました。今回はテキストだけなので、特に難しいことはありません。

CSV の取り込み

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

テキストとしてインポート

リレーションの作成

Prefecture リレーションを追加します。コンサートホールは1つの都道府県に所属するので、1対多の関係となります。このため、1ページ制限を付加しています。都道府県からホール一覧が取得できるように双方向リレーションも追加します。

Prefecture リレーションを追加

Notion API で Prefecture データを準備

これまでと同様に PrefectureStr から Prefecture を設定してみます。prefecture_id_hash まではこれまでと同様です。

prefecture_db = Database.find "https://www.notion.so/hkob/23ad8e4e98ab80ee90c9cb3b73bd4cb9?v=23ad8e4e98ab8160b8c6000c76aea95a&source=copy_link"
=> NotionRubyMapping::Database-23ad8e4e98ab80ee90c9cb3b73bd4cb9
prefectures = prefecture_db.query_database
=> NotionRubyMapping::List-
prefecture_id_hash = prefectures.each_with_object({}) { |prefecture, h| t = prefecture.properties["Name"].full_text; h[t] = prefecture.id }
=>
{"沖縄"=>"23ad8e4e98ab81cf8cacc23adc7cffc7",
...

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

concert_halls_db = Database.find "https://www.notion.so/hkob/23ad8e4e98ab800685edf986f1cb15c2?v=23ad8e4e98ab814fbfb4000c94daee09&source=copy_link"
=> NotionRubyMapping::Database-23ad8e4e98ab800685edf986f1cb15c2
pp = concert_halls_db.properties["Prefecture"]
=>
#<NotionRubyMapping::RelationProperty:0x000000011fd0cbc0
...

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

concert_halls = concert_halls_db.query_database(pp.filter_is_empty)
=> NotionRubyMapping::List-

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

concert_halls.each do |concert_hall|
  cp = concert_hall.properties
  prefecture_str = cp["PrefectureStr"].full_text
  ids = prefecture_str.split(", ").map { |k| prefecture_id_hash[k] }
  cp["Prefecture"].relation = ids
  p [cp["Name"].full_text, prefecture_str]
  concert_hall.save
end
["赤坂 BLITZ", "東京"]
["東京国際フォーラム", "東京"]
["神戸国際会館ハーバーランドプラザ", "兵庫"]
["香川県県民ホール", "香川"]
(後略)

これで無事に Prefecture リレーションが設定されたので、PrefectureStr は削除してしまいます。

PrefectureStr を削除した ConcertHalls

おわりに

これで Prefectures と ConcertHalls についても取り込みが終わりました。次は Concerts と ConcertHalls を繋ぐ Performances について解説します。長くなりそうなので、解説は土曜日になるかもしれません。明日は Notion 座談会なので、軽いアップデート紹介くらいで済ませる予定です。

hkob.notion.site