Notionデータベースにおいては、データベース本体と一緒に全レコードを削除することはできますが、デーベース自体は残しつつ、レコードすべてを一括削除させることはできません。
手動でできることといえばテーブルビューにおいて複数レコード(50列)を一括選択し、削除を繰り返していくことですが、データ量が膨大な場合は大変です。
そこで、手動削除の方法をご紹介しつつ、Notion APIを利用してAPIからデータベース上の全レコードを自動的に削除する方法をご紹介します。
目次:
手動でデータベース内のレコードを一括削除する方法(繰り返し複数選択)
まず、Notion上において唯一手動でできることが、テーブルビューにおいて複数行(50レコード)を一括選択して、ゴミ箱マークによって削除すること。
「グループ化すればグループ化した対象を一括削除できる」との情報を目にしましたが、試したところ2024/12/31時点ではそのようなグルーピング対象を一括削除する操作はできないようになっていました。
これを繰り返していけばすべてのレコードを削除することができますが、たとえばレコード数が2,000〜数万を超えるケースなど、膨大なデータ量がデータベース内にある場合などは繰り返し作業がとても面倒です。
Notion APIによってすべてのページを自動的に削除する
そこで、Notion APIを利用して、APi操作によってレコードを自動的に削除していきます。
Pythonでスクリプトを書くために、公式SDKであるnotion-sdk-pyを利用します。
Notion API利用のための準備や詳細については、下記の記事を参考にしてください。
notion-sdk-pyのバージョンを確認する
まず、Notion APIによってページをゴミ箱に移動するという操作が可能なのは、notion-sdk-pyバージョンが2.3.0以上になります。
2.3.0は18-12-2024にリリースされた新しいバージョンになります。
本リリースによって、ゴミ箱に移動させるパラメータ in_trash が付与できるようになりました。
以前まではarchivedというパラメータによって制御していたものが、Notion本体のゴミ箱に関するアップデートによってAPIエンドポイント側での仕様も変更になったとのこと。
参考: ゴミ箱の扱い変化に伴うAPIエンドポイントのパラメータ変更について #Notion | DevelopersIO
具体的には、 ページをアップデートする操作の際、プロパティとして in_trash: True とセットするだけでOKです。
参考: notion-sdk-py/notion_client/api_endpoints.py at main · ramnes/notion-sdk-py
まずは削除対象のデータベースIDを取得
まずは削除対象とするデータベースIDを取得します。
以下はクエリによってヒットしたデータベース名とIDを返す関数です。
# Get DB info from query, title and id
def get_db_names_and_ids_from_query(client, query: str) -> dict:
"""
Search for databases in Notion using a query string and return a dictionary containing database names and IDs.
Args:
client: The Notion client object.
query (str): The search query string.
Returns:
dict: A dictionary containing 'db_title' and 'db_id' for found databases.
If no databases are found, returns an empty dictionary.
"""
results = client.search(query=query).get("results")
# Dict for db_info. {db_title: db_id}
db_names_ids = {}
db_count = 0
for result in results:
# Check if the result is a database
if result["object"] == "database":
db_count += 1
# db_title: db_id
db_names_ids[result["title"][0]["plain_text"]] = result["id"]
if db_count:
print(f"Found {db_count} databases.")
return db_names_ids
else:
print(f"No databases found with query: {query}")
return {}
上記関数を以下のように実行して、データベースIDを取得します。
# データベースIDを取得
people_dbs = get_db_names_and_ids_from_query(client, query="People")
# 削除対象とするデータベース
database_id=people_dbs['People']
削除対象データベース内のページIDをすべて取得
削除対象となる、データベース内のページIDをすべて取得していきます。削除対象のデータベースIDに基づいて、削除する全ページのIDを取得します。
import time
# Get All Page info from a specific DB, even though it is more than 100 pages
def get_all_pages_info_from_db_id(self, databaseID: str) -> list:
"""Return the query of all the databases."""
data = self.databases.query(databaseID)
# Retrieve the object, has_more, and next_cursor
database_object = data['object']
has_more = data['has_more']
next_cursor = data['next_cursor']
while has_more == True:
# Sleep for 2 second to avoid rate limit
time.sleep(2)
data_while = self.databases.query(databaseID, start_cursor=next_cursor)
# Append the results to the data
for row in data_while['results']:
data['results'].append(row)
# Update the has_more and next_cursor
has_more = data_while['has_more']
next_cursor = data_while['next_cursor']
# Create a new database object with the updated data
new_database = {
"object": database_object,
"results": data["results"],
"next_cursor": next_cursor,
"has_more": has_more
}
# Return only the results (pages)
return new_database["results"]
関数を実行して、データベース内のすべてのページ情報を取得します。
# 削除対象データベースからすべてのページ情報を取得
pages_to_delete = get_all_pages_info_from_db_id(client, database_id)
# ページIDのみのリストを作成
page_ids_to_delete = [page['id'] for page in pages_to_delete]
ページIDを指定して全ページを削除していく
Notion API操作によるページの削除ですが、実際に利用するのはDELETEメソッドではなくUPDATE(PATCH)メソッドとなります。
以下のように、ページ削除を実行する関数を作成します。
# Delete the page
def delete_page_with_page_id(client, page_id):
response = client.pages.update(
**{
"page_id": page_id,
"in_trash": True
}
)
return response
あとは削除対象ページでループを回して、1つずつ自動的に削除されるようにしましょう。下記はエラーハンドリングを含めた削除の実行例です。
# Delete all the DB pages
error_cases_info = []
for page in page_ids_to_delete:
try:
response = delete_page_with_page_id(client, page['id'])
print(f"Deleted page {page['id']}")
time.sleep(3)
except Exception as e:
print("--------------------------------")
print(f"Error deleting page {page['id']}: {e}")
print("--------------------------------")
error_cases_info.append(f"{page['id']}: {e}")
time.sleep(3)
print("Completed!🎉")
print(f"Error cases: {error_cases_info}")
以上で完了です。大量のレコードがありレコードを削除したいものの、データベース本体は残したいという場合にご活用ください。
この記事の気になる箇所を読み返す:
Category: Notion
Tags: Python