はじめに
hkob の雑記録の第211回目は、Device に接続する Media を追加します。
ER図
Media は Devices に接続します。こちらは1対多の接続になります。

Media のエクスポート
Media は以下のプロパティをエクスポートすることにします。もともと Device type は存在しなかったのですが、Device だけではページを一意に特定できないので、ロールアップを追加しました。

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

前回と同様に CSV に書き出し後、リレーションの URL 削除をしてしまいます。
sed 's/ (https:\/\/www.notion.so[^)]*)//g' Media\ 9b266c3d0b3f47a5b0768aee50de08f4.csv | sed 's/\([0-9][0-9]*\)\/\([0-9][0-9]*\)\/\([0-9][0-9]*\)/\1-\2-\3/g' | sed 's/ → /\//g' > Media.csv
変換結果は以下のようになります。この後 Device というリレーションを作成するので、DeviceStr というタイトルに変更しています。
Name,Type,Maker,Price,URL,DeviceStr,Device type K-1564,EP,Warner Pioneer,¥700,,NEW SEASON,Single LKC-2025,カセット,Warner Pioneer,"¥1,000",,NEW SEASON,Single iTunes,Apple Music,Warner Music Japan,¥510,https://music.apple.com/jp/album/new-season-single/528968883,NEW SEASON,Single K-12533,LP,Warner Pioneer,"¥2,800",,NEW SEASON,Album
Media の作成 & インポート
森高千里DBの下に作成したいので、また Cmd-Opt-9 で新規ページを作成します。この新規ページを開き、インポートを実施しました。

インポートを実行しました。Price の部分に¥マークが入っていたりしたために、うまく取り込めなかったようです。こちらもプレビューで変換できていたので安心していました。リレーションまで設定してから気づいたのですが、CSV ファイルを直接編集して、結局インポートからやり直しました。

取得し直して、数値を円表示に変更しました。この辺りがシームレスにインポートできるといいのですが。

リレーションの作成
Device リレーションを追加します。Device は1対多の関係となります。また双方向リレーションも追加します。

Notion API で Device データを準備
昨日と同様に複数プロパティから id を取得したりする必要があり、かなり面倒な処理となるので、スクリプトを記載します。Device は Name と Device type で一意のページを取得します。
#! /usr/bin/env ruby require "notion_ruby_mapping" include NotionRubyMapping NotionRubyMapping.configure { |c| c.token = ENV["NOTION_API_KEY"] } devices_db = Database.find "236d8e4e98ab80e0b548f6e419a81edb" devices_id_hash = devices_db.query_database.each_with_object({}) do |device, hash| name = device.properties["Name"].full_text device_type = device.properties["Device type"].select["name"] hash[[name, device_type]] = device.id end media_db = Database.find "23ed8e4e98ab8013ab6ce59522b64a5f" dp = media_db.properties["Devices"] query = dp.filter_is_empty media_db.query_database(query).each do |m| p m.id mp = m.properties if !(devices_str = mp["DeviceStr"].full_text).empty? device_type = mp["Device type"].full_text devices_str.split(", ").each do |device_str| if (device = devices_id_hash[[device_str, device_type]]) mp["Devices"].relation = [device] p device_str, device_type end end end m.save end
実行結果は以下のようになりました。
ruby relation_for_media.rb "23ed8e4e98ab8158a7f7e22c30e3c998" "Click you Link me" "Album" "23ed8e4e98ab81aaad74f665ee28d652" "ペコちゃんの歌" "Single" "23ed8e4e98ab81ea8ef2c983ef9a3250" "男と女2 -TWO HEARTS TWO VOICES-" "Album" "23ed8e4e98ab815c88edfa1b94c54243" "男と女2 -TWO HEARTS TWO VOICES-" "Album" "23ed8e4e98ab813a9d47d5645fbd7d59" "Welcome to My Life" "Album" "23ed8e4e98ab81d5bfc0eae342a3fc51" "Pacific Heaven at Yokohama Arena さい帯血バンク支援コンサート" "Video" "23ed8e4e98ab81e3a3c9dc542ba30cb5" "もういちど逢いたくて ORIGINAL SOUND TRACK" "Album" "23ed8e4e98ab8143aeb4d3c9b8025a2d" "私には夢がある" "Album" "23ed8e4e98ab8160a96bf54e90e68575" "FLASH" "Album" "23ed8e4e98ab812d9dc7d1e0e31db1b9" "シャ乱Q 結成20周年記念武道館ライブ!" "Video" "23ed8e4e98ab81c5b7e8ca938e289c06" "CHISATO MORITAKA DVD COLLECTION No.15"
結果として以下のようにリレーションが設定できました。

必要なくなったプロパティを削除しました。

おわりに
Media も 316件あるので、自動化できてよかったです。