Notionデータベースは主キー列(タイトル列)が固定されており、CSVインポート・エクスポートやレコードの移動、データベースの複製などを用いたとしても主キー列と他の列を入れ替えることはできません。
そこで、Notion APIを利用し、プログラム(Python)によってコピー元DBからすべての情報を取得。手元で主キー列を並べ替えたうえで移行先DBへとすべての情報を投稿することで、実質的に主キー列を並べ替えた状態でデータベースを複製させることができました。
もし同一DBで主キー列と他の列の変更を行いたい場合、移行先DB=コピー元DBとすることで同一DB内の値変更が可能です。 この場合、一旦DBの情報を手元で取得、並び替えてから再度同じDBへと投稿する流れとなります。
本記事ではテスト投稿も含め、段階的に実施した手順をご紹介します。
1つ1つの解説はいらないので早く主キー列の入れ替えを実施したい、という場合は 本番: すべてのページで移行先のNotionデータベースへ主キーを入れ替えた状態で投稿 の箇所をご覧ください。
ただしコード内で利用している関数については遡ってご確認ください。
なお、Notion APIの利用にはPython用公式パッケージであるnotion-sdk-pyを用いています。
notion-sdk-py
notion-sdk-py is a simple and easy to use client library for the official Notion API.
ramnes.github.io
Notion APIに関する関連記事:
- Notion APIで大量のページをリレーション付きで一括投稿する
- Notionデータベースのレコード行を一括削除する(API, Python)
目次:
- 作業全体の流れ
- notion-sdk-pyを利用する準備
- Notionプロフィールページからインテグレーションを作成
- Notionの該当ページにインテグレーションを接続し、API利用を許可
- notion-sdk-pyのインストール
- コピー元となるデータベースの情報を取得
- コピー元となるデータベースのIDを取得する
- データベース内のすべての情報を取得(レコード数が100件までの場合)
- 取得するデータベースのレコード数・ページ数(列)が100を超える場合
- APIで取得したデータベースの中身を検証
- (省略可)API経由でデータベースを作成する
- API経由でデータベースを作成するために必要な情報
- 主キー(タイトル列)とその他の情報を並べ替える
- 必要な箇所の値を抜き出す
- 投稿用フォーマットとして並べ替えたpropertiesを作成する
- 移行先DBに並べ替えた情報を投稿していく
- 単一jsonのプロパティでテスト投稿
- 本番: すべてのページで移行先のNotionデータベースへ主キーを並べ替えた状態で投稿
- コピー元DBの情報を取得
- コピー元DBのすべてのページについて、主キー列を入れ替えた辞書inリストを作成
- 移行先DBにすべてのページ分のプロパティを投稿
作業全体の流れ
流れとしては下記。
- コピー元となるデータベースの情報をすべて取得
- 手元で、新規作成するデータベースの情報を並べ替えた情報で作成
- 並べ替えた情報で、Notion上にデータベースを新規作成
ただし、そもそもの前提としてNotionでの主キーの型はテキスト形式のみ受け付ける形となっています。たとえば主キーとしてセレクト・マルチセレクトなどの通常のテキスト以外の形式を設置することはNotionの仕様上できませんのでご注意ください。
notion-sdk-pyを利用する準備
Notionプロフィールページからインテグレーションを作成
APIを利用する準備として、Web上で自身のNotionプロフィール > インテグレーション からAPI・インテグレーションを作成のうえ、該当のNotionページ・DBに接続します。
Notion – The all-in-one workspace for your notes, tasks, wikis, and databases.
A new tool that blends your everyday work apps into one. It's the all-in-one workspace for you and your team
www.notion.so
新規インテグレーションを作成。
次ページで、内部インテグレーションシークレットを保存しておきます。ここで取得したインテグレーションシークレットキーがAPIキー。
下記のようにして環境変数として.bash_profileに保存しておきます。
# Notion API Key
NOTION_TOKEN=your_integration_secret
export NOTION_TOKEN一時的に利用しすぐ破棄するならjsonファイルとして保存しておくのも良いでしょう。
Notionの該当ページにインテグレーションを接続し、API利用を許可
主キー入れ替えとなるコピー元・移行先のDBがあるNotionページとのインテグレーション接続もそれぞれ忘れずに実施しておきます。
該当ページ右上の三点リーダ > Connections から、先ほど作成したインテグレーションに接続したら完了です。これでAPI利用のNotion側準備が整いました。
notion-sdk-pyのインストール
続いて、プログラム側での準備です。
まずはnotion-sdk-pyをインストール。
# ryeの場合
$ rye add notion-client
# pipの場合
$ pip install notion-clientコードファイル上にてNotionクライアントの準備。
import os
from notion_client import Client
# Secret Integrationキーを利用してNotionクライアントを生成
client = Client(auth=os.environ["NOTION_TOKEN"])コピー元となるデータベースの情報を取得
以下からは、Notion APIで大量のページをリレーション付きで一括投稿する において作成した関数を利用しています。データベースの情報を取得していきます。
コピー元となるデータベースのIDを取得する
まずは、元となるデータベースのIDを調べます。
データベース内のすべての情報を取得(レコード数が100件までの場合)
次に、データベース内のすべてのページ情報(すべての列の情報)を取得します。Notion APIでは、データベース内のレコードは通常ページと区別なく、ページとして扱われます。
get_pages_info_from_db_idを実行すると、JSON形式のリストでページ情報が返ってきます。
取得するデータベースのレコード数・ページ数(列)が100を超える場合
Notion APIは一度のリクエストで取得できるデータベースのページ数(列数)を100までに制限しています。
そのため、ページ数が100を超える場合には以下の関数を実行して、100を超えるページ(列)を取得してください。
100を超えるレコード・ページ(列)を取得するAPI操作について参考:
- API requesting a full database (more than 100 pages)?? : r/Notion
- 【GAS】Notion APIの1リクエストあたり100件の取得制限に対応する(1000件以上取得する) - みやもとメモ
APIで取得したデータベースの中身を検証
今回はテストとして、下記のような構造のデータベースで実施してみました。
# データベースIDを取得
people_dbs = get_db_names_and_ids_from_query(client, query="People")
# 取得したデータベースのうち、Peopleデータベースのページ情報をすべて取得
people_db_pages = get_pages_info_from_db_id(
client,
database_id=people_dbs['People']
)関数get_pages_info_from_db_idを実行して返ってきた、people_db_pagesリスト内のアイテム(=1つ1つのjson)には、Notion上データベースにおける横一列の情報が格納されています。
色々な情報が返ってきますが、特に’properties’が必要な情報となってくるでしょう。各プロパティの種類は’type’から判別が可能です。
なお、主キー列のみ少し特殊な種類のプロパティとなります。主キー列のidは’title’で固定となっています。
(省略可)API経由でデータベースを作成する
API経由でデータベースを作成する場合です。
今回はデータベースを複製するのみなので、手動で移行先のデータベースをNotion上に作成するほうが早いでしょう。
ただし、移行元とプロパティの種類・プロパティ名は合わせておくようにしましょう。
参考のため、API経由でデータベースを作成するために必要な情報について残しておきます。
API経由でデータベースを作成するために必要な情報
notion-sdk-pyのGitHub上に、ちょうどデータベースを作成する例が記載されています。
Untitled
これをみると、下記の情報が必要となりそうです。
- 各プロパティ情報
- 列としての名称
- プロパティの種類
- セレクト・マルチセレクトなどの場合は選択肢を設置可能
- 新規データベース名
- アイコン(省略可)
- 親となるページのページID
- 前述の関数でページIDを取得しておきましょう。
移行先データベースを作成したら、作成した移行先DBのIDを関数実行などで取得しておきます。
主キー(タイトル列)とその他の情報を並べ替える
主キーと、入れ替えたい列の情報を入れ替えた状態でjson in リストを作成します。
例として、検証用データベース(People)においてコピー元の主キー: Name と通常のテキスト列: usernameを入れ替えた状態、すなわちusernameを主キーとした状態でjson in リストを作成します。
必要な箇所の値を抜き出す
主キーと入れ替えるということは、それぞれの値に紐づけられるtypeなどの情報が変更となります。
そのため、まずはコピー元の主キー(Name)と入れ替えたい列(username)の値だけを抜き出します。
実際はすべてのページについて抜き出していく必要がありますが、まずは1列だけの情報で試しています。
投稿用フォーマットとして並べ替えたpropertiesを作成する
このとき、主キーを除く他プロパティのIDを付けた状態で作成してしまうと、postした時にエラーとなるため注意しましょう。
プロパティのIDは特定のデータベースのプロパティに対して付与されるため、移行先DBのIDとは不一致となります。
主キーのみ、IDは”title”であらかじめ固定されています。
データベースの複製ではなく、同一DBに再投稿して主キー列の入れ替えのみ実施する場合はプロパティIDは同一なので、残しておいて構いません。
以下はテスト用として、1アイテム分のプロパティを表すjsonとなります。
移行先DBに並べ替えた情報を投稿していく
最後に、並び替えを行った情報を移行先DBへPOSTをして投稿します。
以下に、JSON形式のプロパティを引数として受け取り、その情報でデータベースに投稿する関数を作成しました。
こちらの関数を用いて、指定したプロパティ内容・値で移行先データベースへ情報をPOSTしていきます。
単一jsonのプロパティでテスト投稿
下記はテスト入稿データとして作成した単一のjsonプロパティで投稿する例です。
add_row_with_property_info_to_notion_database(
client,
people_dbs['People_2'],
changed_properties
)無事に、usernameを主キー列、Nameをリッチテキスト列としてコピー元DBと値を入れ替えた形でデータを投稿し、移行させることができました!
テストデータは不要なので、Notion上からレコードを削除しておきましょう。
本番: すべてのページで移行先のNotionデータベースへ主キーを並べ替えた状態で投稿
それでは最後に本番として、すべてのページ情報を主キー列を入れ替えた状態で移行先DBへと投稿します。一連の流れとして実行していきます。
API等の準備は済んでいるものとして、以下実施します。
コピー元DBの情報を取得
まずは、コピー元DBの情報を取得します。(上記で実行済ですが再掲)
コピー元DBのすべてのページについて、主キー列を入れ替えた辞書inリストを作成
次に、コピー元DBのすべてのページについて、主キー列を入れ替えた状態で辞書inリストを作成します。
移行先DBにすべてのページ分のプロパティを投稿
最後に、移行先DB(今回の例ではpeople_2)にすべてのページ分のプロパティを投稿します。
add_row_with_property_info_to_notion_database関数の中身はこちら。
import time
for property in pages_properties_to_upload:
try:
add_row_with_property_info_to_notion_database(
client,
ENTREPRENEUR_DB_ID,
property
)
time.sleep(2)
except Exception as e:
print(e)
breakこれで、無事にすべてのページについて主キー列とリッチテキスト列を入れ替えた状態で投稿できました!実質的に、主キー列を入れ替えてデータベースを複製(別のデータベースへ投稿)したことになります。
Category: Notion
Tags: Python
この記事の気になる箇所を読み返す:
- 作業全体の流れ
- notion-sdk-pyを利用する準備
- Notionプロフィールページからインテグレーションを作成
- Notionの該当ページにインテグレーションを接続し、API利用を許可
- notion-sdk-pyのインストール
- コピー元となるデータベースの情報を取得
- コピー元となるデータベースのIDを取得する
- データベース内のすべての情報を取得(レコード数が100件までの場合)
- 取得するデータベースのレコード数・ページ数(列)が100を超える場合
- APIで取得したデータベースの中身を検証
- (省略可)API経由でデータベースを作成する
- API経由でデータベースを作成するために必要な情報
- 主キー(タイトル列)とその他の情報を並べ替える
- 必要な箇所の値を抜き出す
- 投稿用フォーマットとして並べ替えたpropertiesを作成する
- 移行先DBに並べ替えた情報を投稿していく
- 単一jsonのプロパティでテスト投稿
- 本番: すべてのページで移行先のNotionデータベースへ主キーを並べ替えた状態で投稿
- コピー元DBの情報を取得
- コピー元DBのすべてのページについて、主キー列を入れ替えた辞書inリストを作成
- 移行先DBにすべてのページ分のプロパティを投稿