🗒️

Notion API × Python

2021/09/23に公開

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のアクセスを付与します

    1. Shareボタンを押す

    2. Inviteボタンを押す

    3. Integration "Test API" をInviteする

2-3. Notion SDK for Pythonのインストール

Python用の SDKをインストールします。pipで入ります。

pip install notion-client

3. データベースの読み込み

  1. ライブラリのimport
import os
from pprint import pprint

from notion_client import Client
  1. API Clientの作成
notion = Client(auth=os.environ['NOTION_TOKEN'])
  1. データベースの読み込み
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を使って物件管理を半自動化する方法をまとめているので、よろしければ参考にしていただければと思います。

https://yskst.notion.site/Notion-c10a55f41b914fbcbbfb45c2d581f4f4

Discussion