노션(Notion)API DataBase조회(pagination)

생각하는 마리오네트·2023년 11월 16일

파이썬

목록 보기
10/10
위의 사진은 내가 실제로 사용하는 개인 노션의 위키를 데이터베이스로 만들어둔 모습이다.

우리는 노션의 데이터베이스를 통해서, 사진의 예시처럼 위키를 만들수도 있고, 가계부를 만들수도있고, 혹은 회사에서 아카이빙, 프로젝트등을 위한 데이터베이스를 만들기도 한다.

이번에는 노션API를 사용해서 파이썬으로 직접 불러오는 것을 해보려고 한다.

1. 토큰 발급

먼저 링크에 접속해서 API 토큰을 발급을 받아보자

아래 사진에서 "새 API통합 만들기"를 클릭해서 API 토큰 번호를 저장하자.

2.노션에 토큰 연결하기

우리가 사용하는 노션DB가 있는 페이지에 접속후 오른쪽 상단을 보면 점세개가 있다. 거기를 클릭하면 아래와같이 창이 나오고, 여기서 1번(Add connections)을 눌러서 발급받은 토큰의 명칭을 선택하면 2번처럼 연결을 시킬수 있게된다.

3. 데이터베이스 고유ID 얻기

데이터베이스마다 고유의 값을 가지고 있는데 이 값이 api를 호출할떄 필요하므로 아래 과정을 통해서 값을 얻자.

Copy link to view를 클릭하면 자동으로 데이터베이스 고유아이디가 저장이된다.

4. 데이터베이스 조회

세부적인 RESPONSE는 링크에서 참고하면 좋다.

import request, json
import pandas as pd

def readDatabase(databaseId, headers):
	# DataBase 조회 함수
    
    # endPoint
    readUrl = f"https://api.notion.com/v1/databases/{databaseId}/query"
    
    # api request
    res = requests.post(readUrl, headers=headers)
    data = res.json()
    return data,res

먼저 위의 함수가 조회를 위해서 사용할 함수의 형태이다.
함수에는 databaseId값과 header값들을 인자로 넣어줄 것이다.

# 데이터베이스 고유값
databaseId = "{Your databaseId}"
# 토큰값
token = "{Your Notion Token}"
# 헤더
headers = {
	"Authorization":"Bearer "+ token,
    "Notion-Version":"2022-06-28"
}
# DB조회 요청
data,res = readDatabase(databaseId, headers)

이렇게 하면 data는 우리에게 익숙한 형태의 api조회결과가 나올것이고 res에서는 <Response [200]>가 나올것이다.

번외. Pagination

하지만, 노션 api의 경우 한번에 최대 100개의 행을 불러오는데 만약에 100개 이상의 행을 가진경우는 pagination을 통해서 불러올 수 있는데 간단한게 아래에 전체 코드만 공개를 하고 다음 편에 이어서 설명과함께 작성하려고한다.

def query_notion_with_pagination():
	
    
    has_more = True
    next_cursor = None
    
    full_data = []
    databaseId = "{Your database id}"
    token = "{Your notion token}"
    headers = {
    	"Authorization": "Bearer " + token,
        "Notion-Version": "2022-06-28"
    }
    
    readUrl = f"https://api.notion.com/v1/databases/{databaseId_}/query"
    
    
    While has_more:
    	
    	if next_cursor:
        	response = requests.post(readUrl, 
            						headers = headers, 
                                    json = {'start_cursor':next_cursor})
        else:
        	response = requests.post(readUrl,
            						 headers = headers)
        data = response.json()
        
        full_data.extend(data['results']
        
        has_more = data['has_more']
        next_cursor = data.get('next_cursor')

        
    return full_data
profile
문제를해결하는도구로서의"데이터"

0개의 댓글