Notion API × Python
1.はじめに
- この記事は、PythonからNotion APIを呼び出す方法についてまとめた記事です
- 使用するまでの設定方法に加え、データベースを読み書きする方法について具体例を紹介します
2.設定
2-1. Integrationの作成
-
まずは、Integrationを作成します。このステップに関しては、以下の記事で詳しく紹介されています
-
今回は"Test API"という名前のIntegrationを作成しました
-
IntegrationのTokenを控えておきます
-
PythonからIntegrationを使用できるように、環境変数 NOTION_TOKEN としてIntegrationのTokenを.bash_profileなどに記載します
export NOTION_TOKEN="Integration Token"
2-2. Notionページの作成
-
Notionページをデータベースとして作成します
-
今回は下画像のような野菜データベースページを作成しました
-
各カラムの構成は以下のようになっています
- Name(PROPERTY TYPE : title)
- 個数(PROPERTY TYPE : Number)
-
作成したデータベースにIntegration APIのアクセスを付与します
-
Shareボタンを押す
-
Inviteボタンを押す
-
Integration "Test API" をInviteする
-
2-3. Notion SDK for Pythonのインストール
Python用の SDKをインストールします。pipで入ります。
pip install notion-client
3. データベースの読み込み
- ライブラリのimport
import os
from pprint import pprint
from notion_client import Client
- API Clientの作成
notion = Client(auth=os.environ['NOTION_TOKEN'])
- データベースの読み込み
- 下記コードに取得したいデータベースのデータベースIDを指定すれば取得できます
- データベースIDは作成したページのURLから下記のように取得できます
- URL : https://www.notion.so/yskst/c8e925b380314faa8f3ed6b6f08c030e?v=dd56d05ac5e243a4b9834980442ad8c7
- データベースID:c8e925b380314faa8f3ed6b6f08c030e
- データベースIDは作成したページのURLから下記のように取得できます
notion.databases.query(
**{
'database_id' : '' # データベースID
}
)
- 取得して、中身を見てみます
db = notion.databases.query(
**{
'database_id' : 'c8e925b380314faa8f3ed6b6f08c030e' # データベースID
}
)
pprint(db)
- データベースの情報はdict型で格納されています
{'has_more': False,
'next_cursor': None,
'object': 'list',
'results': [{'archived': False,
'created_time': '2021-06-18T02:38:06.679Z',
'id': '2a6be367-6063-432c-8397-14415a63f083',
'last_edited_time': '2021-06-18T02:41:00.000Z',
'object': 'page',
'parent': {'database_id': 'c8e925b3-8031-4faa-8f3e-d6b6f08c030e',
'type': 'database_id'},
'properties': {'Name': {'id': 'title',
'title': [{'annotations': {'bold': False,
'code': False,
'color': 'default',
'italic': False,
'strikethrough': False,
'underline': False},
'href': None,
'plain_text': 'トマト',
'text': {'content': 'トマト',
'link': None},
'type': 'text'}],
'type': 'title'},
'個数': {'id': 't_nx',
'number': 3,
'type': 'number'}}},
{'archived': False,
'created_time': '2021-06-18T02:38:06.679Z',
'id': 'b2355c50-8823-4a6a-ae02-0fa647a78014',
'last_edited_time': '2021-06-18T02:41:00.000Z',
'object': 'page',
'parent': {'database_id': 'c8e925b3-8031-4faa-8f3e-d6b6f08c030e',
'type': 'database_id'},
'properties': {'Name': {'id': 'title',
'title': [{'annotations': {'bold': False,
'code': False,
'color': 'default',
'italic': False,
'strikethrough': False,
'underline': False},
'href': None,
'plain_text': 'にんじん',
'text': {'content': 'にんじん',
'link': None},
'type': 'text'}],
'type': 'title'},
'個数': {'id': 't_nx',
'number': 2,
'type': 'number'}}},
{'archived': False,
'created_time': '2021-06-18T02:38:06.679Z',
'id': '16896051-1be9-4a33-a7e9-1ca21950c1cc',
'last_edited_time': '2021-06-18T02:41:00.000Z',
'object': 'page',
'parent': {'database_id': 'c8e925b3-8031-4faa-8f3e-d6b6f08c030e',
'type': 'database_id'},
'properties': {'Name': {'id': 'title',
'title': [{'annotations': {'bold': False,
'code': False,
'color': 'default',
'italic': False,
'strikethrough': False,
'underline': False},
'href': None,
'plain_text': 'じゃがいも',
'text': {'content': 'じゃがいも',
'link': None},
'type': 'text'}],
'type': 'title'},
'個数': {'id': 't_nx',
'number': 1,
'type': 'number'}}}]}
- データベースの各レコードを取得して表示してみます
for idx in range(len(db['results'])):
name = db['results'][idx]['properties']['Name']['title'][0]['text']['content']
quantity = db['results'][idx]['properties']['個数']['number']
print('{} : 個数 {}'.format(name, quantity))
- 順序は担保されてませんが、各レコードとカラムの値を取得することができています
トマト : 個数 3
にんじん : 個数 2
じゃがいも : 個数 1
4. データベースへの書き込み
続いて、データベースのへの書き込みを行ってみます。
読み込み時と同様に、下記コードに対象のデータベースIDを指定すれば書き込むことができます
notion.pages.create(
**{
'parent': {'database_id': ''}, # データベースID
'properties': {} # ここにカラム名と値を記載
}
)
「カラム名と値を記載」の部分がわかりづらいので、具体例をあげてみます。
ここでは、野菜データベースに以下の2レコードを追加する例を記載します。
- きゅうり : 個数 4
- ナス : 個数 3
# 追加する野菜と個数の辞書を作成
append_dict = {'きゅうり' : 4, 'なす' : 5}
# 1レコードずつデータベースにInsertする
for vegetable,amount in append_dict.items():
notion.pages.create(
**{
'parent': { 'database_id': 'c8e925b380314faa8f3ed6b6f08c030e'},
'properties': {
'Name': {
'title': [
{
'text': {
'content': vegetable # 野菜名を指定
}
}
]
},
'個数': {
'number' : amount # 個数を指定
}
}
}
)
データベースを見てみると、無事2つのレコードが追加されていることがわかります。
5. おわりに
今回はPythonとNotionAPIを使って、データベースの読み書きを行う方法についてまとめてみました。
本記事で紹介したコードをベースにすれば、Notionの活用幅がグッと広がると思いました。
例えば以下の記事では、PythonとNotionAPIを使って物件管理を半自動化する方法をまとめているので、よろしければ参考にしていただければと思います。
Discussion