fix(v2): m002 — rename dca_commission_splits.wallet_id → target
The collapsed m001 introduced commit (2886dd7) renamed wallet_id → target
on dca_commission_splits, but a real-world install caught a subtle
LNbits-side wrinkle: the sqlite file persists across extension
uninstall+reinstall. LNbits' uninstall wipes the dbversions tracker
(so m001 re-runs), but NOT the satoshimachine.sqlite3 file. With
`CREATE TABLE IF NOT EXISTS` in m001, the pre-existing
dca_commission_splits table (created by an earlier partial m005 with
the old `wallet_id` column) survived unchanged. m001 marked itself
complete, then runtime queries blew up because the model expected
`target` but the DB still had `wallet_id`:
ERROR | distribution.process_settlement:389
unexpected: 1 validation error for CommissionSplit
target
field required (type=value_error.missing)
m002 fixes it idempotently:
- Probes for the wallet_id column via SELECT
- If it exists (stale install): ALTER TABLE … RENAME COLUMN
- If the SELECT errors (fresh install or already renamed): no-op
ALTER TABLE … RENAME COLUMN is portable across SQLite 3.25+ and
PostgreSQL. Both backends preserve row data on rename.
Refs: aiolabs/satmachineadmin#9, found while validating cash-in flow
end-to-end (LNURL-withdraw redemption on the regtest stack).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
a86f8dc25d
commit
47916bdddd
1 changed files with 30 additions and 0 deletions
|
|
@ -302,3 +302,33 @@ async def m001_satmachine_v2_initial(db):
|
|||
);
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
async def m002_rename_commission_split_wallet_id_to_target(db):
|
||||
"""One-off correction for installs whose `dca_commission_splits` table
|
||||
pre-exists from an earlier partial v2 migration run (where the column
|
||||
was named `wallet_id`). The collapsed m001 uses `CREATE TABLE IF NOT
|
||||
EXISTS`, which is a no-op when the table already exists — so the
|
||||
schema drift survives the documented uninstall + reinstall workflow
|
||||
because LNbits' uninstall wipes the dbversions tracker but NOT the
|
||||
satoshimachine.sqlite3 file on disk.
|
||||
|
||||
Idempotent: probes for the `wallet_id` column via a SELECT. If the
|
||||
probe succeeds the column still exists and we RENAME it; otherwise
|
||||
the rename is already done (or the table was fresh) and we no-op.
|
||||
|
||||
Fresh installs from m001 onward already have `target` directly — for
|
||||
them this migration is a no-op.
|
||||
"""
|
||||
try:
|
||||
await db.fetchone(
|
||||
"SELECT wallet_id FROM satoshimachine.dca_commission_splits LIMIT 1"
|
||||
)
|
||||
except Exception:
|
||||
# wallet_id column doesn't exist; either m001 produced the correct
|
||||
# schema on a fresh install or the rename already landed.
|
||||
return
|
||||
await db.execute(
|
||||
"ALTER TABLE satoshimachine.dca_commission_splits "
|
||||
"RENAME COLUMN wallet_id TO target"
|
||||
)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue