asopi tech
asopi techIndie Developer

Asopitech With · 単語カード

Anki with Alopex DB

Ankiは、復習の時期を自動で決めてくれる単語カードのアプリです。これをAlopex DBを使って再現すると…?

更新: 2026/10/12

どんなサービスか

Ankiは、単語カードのアプリです。カードはデッキに分け、復習のたびに思い出せたかを答えると、忘れそうな時期に次の復習が来ます。扱うデータは、カード、デッキ、復習の履歴です。

データの置き場所

  • SQLテーブル:カード、デッキ、復習の履歴をテーブルに持ちます。今日復習するカードは、次の復習日の条件で引きます。
  • カラムナーテーブル:復習の履歴をカラムナーテーブルに持ち、デッキごとの正答の推移を集計します。
  • ベクトル:カードの表と裏の埋め込みをベクトル列に持ち、同じことを聞く重複したカードを見つけます。

次の復習日を決める計算は、アプリのコードです。

配置の形

Alopex DBを、デスクトップと端末のアプリに組み込みます。デッキは1つのファイルに入るので、人に渡すときはファイルを渡します。

Alopex DBが合う理由

暗記のアプリは、カードの数と復習の履歴が年々増えていきます。Alopex DBは、復習の予定、履歴の集計、重複の発見を1つのファイルの中で行います。

コードで見る

カード・デッキ・復習の履歴を持ち、今日までに期限が来たカードをSQLで引きます。復習の中心だけを取り出したコードです。

import alopex
from datetime import date

db = alopex.Database.open("anki.alopex")

# カード・デッキ・復習の履歴を持つ
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS cards (
        id INTEGER PRIMARY KEY,
        deck TEXT,
        front TEXT,
        back TEXT,
        next_due DATE
    )
""")
db.execute_sql("""
    CREATE TABLE IF NOT EXISTS reviews (
        card_id INTEGER,
        correct INTEGER
    )
""")

cards = [
    (1, "英単語", "apple", "りんご", "2026-10-21"),
    (2, "英単語", "orange", "みかん", "2026-10-25"),
    (3, "歴史", "1192", "鎌倉幕府の成立", "2026-10-20"),
]
for c in cards:
    db.execute_sql("INSERT INTO cards (id, deck, front, back, next_due) VALUES (?, ?, ?, ?, ?)", list(c))
for card_id, correct in [(1, 1), (1, 0), (3, 1)]:
    db.execute_sql("INSERT INTO reviews (card_id, correct) VALUES (?, ?)", [card_id, correct])

# 今日までに期限が来たカード(今日復習する分)を引く
today = date.today().isoformat()
print("-- 今日の復習")
for row in db.execute_sql(
    "SELECT deck, front FROM cards WHERE next_due <= CAST(? AS DATE) ORDER BY next_due",
    [today],
):
    print("  ", row["deck"], row["front"])

# デッキごとの正答数を集計する
print("-- 正答数")
for row in db.execute_sql("""
    SELECT c.deck, SUM(r.correct) AS ok, COUNT(*) AS n
    FROM reviews AS r
    JOIN cards AS c ON c.id = r.card_id
    GROUP BY c.deck
"""):
    print("  ", row["deck"], f'{row["ok"]}/{row["n"]}')

次の復習日の条件で、今日の分だけを引けます。履歴の集計も同じSQLです。

復習の予定、履歴の集計、重複の発見までを一つのファイルで行えるのがAlopex DBです。単語カードのアプリで試してみよう。使い方はクイックスタートにあります。

関連リンク