MENU

Python × Notion API でデータベースのテーブル定義を取得する

たぬ

こんにちは、グロースハッカーの たぬ ( @tanuhack )です。

Notion API を使って、データベースの構造を取得するには、下の URL を GET メソッドでリクエストします。

https://api.notion.com/v1/databases/{ データベースID }

公式リファレンス
https://developers.notion.com/reference/get-database

Pythonで Notion API を使用するには、公式の Notion SDK が用意されていないので、Requests モジュール などの HTTP 関数を使って直接 API を叩く必要があります。

この記事では、次の簡易的なデータベースのテーブル定義を取得する例を紹介します。

目次

準備

トークンを取得する

別の記事で紹介する予定なので割愛します。

Botとデータベースを紐付ける

データベースページのshareボタンで Bot(Integration)をデータベースを紐付けます。Bot ユーザーの権限はCan editのみ設定できます。

データベースIDを取得する

データベース ID は、データベースページの URL から取得できます。

https://www.notion.so/***********/{ データベースID(32文字) }?v=...

デスクトップアプリで確認する場合は、ShareからCopy linkを選択します。

インラインデータベースを使用している場合は、データベースがフルページで表示されていることを確認してください。

テーブル定義を取得する

では、実際に Requests モジュールを使って、Notion API からデータベースのテーブル定義を取得してみましょう。

import requests

NOTION_ACCESS_TOKEN = '{ トークン }'
NOTION_DATABASE_ID = '{ データベースID }'

url = f"https://api.notion.com/v1/databases/{NOTION_DATABASE_ID}"
headers = {
  'Authorization': 'Bearer ' + NOTION_ACCESS_TOKEN,
  'Notion-Version': '2021-05-13',
}
r = requests.get(url, headers=headers)
data = r.json()

以下のようなレスポンスが返ってくれば成功しています。

from pprint import pprint

pprint(data, sort_dicts=False)
# {'object': 'database',
#  'id': '{ データベースID }',
#  'created_time': '2021-07-01T03:54:36.941Z',
#  'last_edited_time': '2021-07-01T04:05:00.000Z',
#  'title': [{'type': 'text',
#             'text': {'content': 'フルーツテーブル', 'link': None},
#             'annotations': {'bold': False,
#                             'italic': False,
#                             'strikethrough': False,
#                             'underline': False,
#                             'code': False,
#                             'color': 'default'},
#             'plain_text': 'フルーツテーブル',
#             'href': None}],
#  'properties': {'Price': {'id': 'S<|H',
#                           'type': 'number',
#                           'number': {'format': 'number'}},
#                 'Color': {'id': 'mH\\?',
#                           'type': 'select',
#                           'select': {'options': [{'id': 'd0408e6e-4972-4954-aaa5-864b53054c7f',
#                                                   'name': 'red',
#                                                   'color': 'red'},
#                                                  {'id': 'fa4fabe1-9855-4f99-a753-a81f25849172',
#                                                   'name': 'yellow',
#                                                   'color': 'yellow'},
#                                                  {'id': 'bca0d2a9-a89d-45c6-a114-752733ed0892',
#                                                   'name': 'Purple',
#                                                   'color': 'purple'}]}},
#                 'Name': {'id': 'title', 'type': 'title', 'title': {}}},
#  'parent': {'type': 'workspace', 'workspace': True}}

プロパティ名とプロパティタイプの辞書が欲しい場合は、辞書内包表記を使って取得できます。

print({k: v['type'] for k, v in data['properties'].items()})
# {'Price': 'number', 'Color': 'select', 'Name': 'title'}

この記事が気に入ったら
フォローしてね!

シェアしていただけると励みになります
  • URLをコピーしました!

コメント

コメントする

目次
閉じる