Asopitech With · クラウドストレージ
Dropbox ファイル同期 with Alopex DB
Dropboxのファイル同期は、クラウドストレージのDropboxで、ファイルと版の履歴を端末どうしでそろえる仕組みです。Alopex DBで同じものを作るとしたら…?
更新: 2026/10/12
どんなサービスか
Dropboxは、ファイルを端末どうしで同期し、共有するサービスです。保存したファイルは自動ですべての端末に同期され、以前の版に戻せます。オフラインで編集した分は、つながったときに反映されます。扱うデータは、ファイルとフォルダの情報、版の履歴、共有の設定です。
データの置き場所
- SQLテーブル:ファイル、フォルダ、版、共有をテーブルに持ちます。以前の版の一覧は、版のテーブルから引きます。
- トランザクション:ファイルの移動や名前の変更と、版の追加を、同じトランザクションでコミットします。
ファイルの中身は、ファイルのストレージに置き、テーブルにはその情報だけを持ちます。
配置の形
端末のアプリにはAlopex DBを組み込み、オフラインでもファイルの一覧と版を引けます。クラウドではAlopex DBのサーバーが同期を受け、利用者が増えたらAlopex DBのクラスタに広げます。端末とサーバーで同じSQLを使います。
Alopex DBが合う理由
同期のサービスは、端末とクラウドの両方に同じファイルの情報を持ちます。Alopex DBは、端末の組み込みとサーバーで同じデータの形とSQLを使えるので、両方の作りがそろいます。
コードで見る
ファイルと版をテーブルに持ち、改名と版の追加を同じトランザクションでコミットします。整合を守る中心だけを取り出したコードです。
import alopex
# 端末にもサーバーにも同じSQL。ここでは端末側の .alopex ファイル
db = alopex.Database.open("dropbox.alopex")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS files (
id INTEGER PRIMARY KEY,
name TEXT
)
""")
db.execute_sql("""
CREATE TABLE IF NOT EXISTS versions (
file_id INTEGER,
rev INTEGER,
note TEXT,
created DATE
)
""")
db.execute_sql("INSERT INTO files (id, name) VALUES (?, ?)", [1, "report.txt"])
db.execute_sql("INSERT INTO versions (file_id, rev, note, created) VALUES (?, ?, ?, ?)", [1, 1, "初版", "2026-10-18"])
# 改名と版の追加を、同じトランザクションでコミットする
tx = db.begin(alopex.TxnMode.READ_WRITE)
try:
tx.execute_sql("UPDATE files SET name = ? WHERE id = ?", ["report-final.txt", 1])
tx.execute_sql("INSERT INTO versions (file_id, rev, note, created) VALUES (?, ?, ?, ?)", [1, 2, "改名", "2026-10-20"])
tx.commit()
except Exception:
tx.rollback()
raise
# 版の履歴を新しい順に引く
rows = db.execute_sql("""
SELECT v.rev, v.note, v.created
FROM versions AS v
JOIN files AS f ON f.id = v.file_id
WHERE f.name = ?
ORDER BY v.rev DESC
""", ["report-final.txt"])
for row in rows:
print(f"rev{row['rev']}", row["created"], row["note"])改名と版の追加が、ひとつのトランザクションでまとまります。途中の状態が見えることはありません。
端末への組み込みとサーバーで同じSQLを使えるAlopex DBは、同期のサービスの両側をそろえられます。クイックスタートで両方を試せます。