Asopitech With · タスク管理
Todoist フィルター with Alopex DB
Todoistは、思いついたタスクをすぐに書き留め、プロジェクトやラベル、フィルターで整理するタスク管理アプリです。これをAlopex DBで作り直すと…?
更新: 2026/10/13
どんなサービスか
Todoistでは、ふだんの言葉でタスクを書き留め、プロジェクトとラベルで整理します。ラベルは、プロジェクトをまたいで似たタスクをまとめます。フィルターは、問い合わせの書き方で条件を書いた、タスクの独自の見え方です。今回作り直すのは、タスクとフィルターの部分です。
データの置き場所
- Alopex DBのSQLテーブル:タスク、プロジェクト、セクション、ラベル、タスクとラベルの対応をSQLテーブルに持ちます。
- SQL:フィルターの条件は、期限、優先度、ラベル、プロジェクトをつなぐSQLの条件に置き換えます。
- 全文検索:タスクの名前とメモを全文検索で探します。
タスクの文章から期限を読み取るのは、アプリのコードです。
配置の形
Alopex DBを、スマホとパソコンのアプリに組み込みます。タスクは手元にあるので、すぐに開けます。チームで共有するタスクは、同じエンジンのAlopex DBのサーバーで受けます。
Alopex DBが合う理由
タスク管理のデータは、タスク、プロジェクト、ラベルの関係と、それを切り出す条件です。Alopex DBは、その関係をSQLテーブルで持ち、フィルターをSQLの条件として端末の中で動かします。
コードで見る
タスクとラベルをテーブルに持ち、フィルターをSQLの条件で書きます。Alopex DBを端末の中のデータの層にした、コアの部分だけを取り出したコードです。
import alopex
from datetime import date, timedelta
# Alopex DB を端末の中のデータの層にする(アプリに組み込む想定)
db = alopex.Database.open("todoist.alopex")
# タスクとラベルを SQL テーブルで持つ(ラベルはプロジェクトをまたいでまとめる)
db.execute_sql("""
CREATE TABLE IF NOT EXISTS tasks (
id INTEGER PRIMARY KEY,
content TEXT NOT NULL,
project TEXT,
priority INTEGER,
due DATE
)
""")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS task_labels (
task_id INTEGER,
label TEXT
)
""")
# タスクを書き留める
db.execute_sql(
"INSERT INTO tasks (id, content, project, priority, due) VALUES (?, ?, ?, ?, ?)",
[1, "請求書を送る", "仕事", 3, "2026-10-24"],
)
db.execute_sql(
"INSERT INTO task_labels (task_id, label) VALUES (?, ?)",
[1, "@お金"],
)
# フィルター=SQL の条件。「今週が期限・優先度が高い・@お金のタスク」
week_end = (date.today() + timedelta(days=7)).isoformat()
rows = db.execute_sql(
"""
SELECT t.id, t.content, t.due
FROM tasks AS t
JOIN task_labels AS l ON l.task_id = t.id
WHERE t.due <= CAST(? AS DATE)
AND t.priority >= 3
AND l.label = ?
ORDER BY t.due
""",
[week_end, "@お金"],
)
for row in rows:
print(row["due"], row["content"])フィルターは、期限・優先度・ラベルをつなぐSQLの条件です。見たい切り口が変わっても、条件を書き換えるだけで済みます。
フィルターをそのままSQLの条件で書けるAlopex DBを、タスクアプリに組み込んでみよう。