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です。単語カードのアプリで試してみよう。使い方はクイックスタートにあります。