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

はじめに

hkob の雑記録の第211回目は、Device に接続する Media を追加します。

ER図

Media は Devices に接続します。こちらは1対多の接続になります。

ER図

Media のエクスポート

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

CSV出力するプロパティ

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

CSV ビュー

前回と同様に 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 で新規ページを作成します。この新規ページを開き、インポートを実施しました。

CSV列の設定

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

インポート失敗 (Price プロパティ)

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

数値に変更後にインポート

リレーションの作成

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

Device リレーションを追加

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"

結果として以下のようにリレーションが設定できました。

Device リレーション設定後

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

プロパティを整理

おわりに

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

hkob.notion.site