T17: backend penyimpanan bersama db.py (sqlite | mysql via PyMySQL)

- db.py: abstraksi connect/query/queryone/replace_snapshot; %s → ? utk sqlite;
  replace snapshot mysql = CREATE IF NOT EXISTS + DELETE + INSERT (MVCC)
- config/.env.example: VEX_DB_BACKEND (default sqlite) + VEX_DB_HOST/PORT/USER/PASS/NAME
- get_voters.persist → db.replace_snapshot; dashboard baca via db.query
- LIKE pakai ESCAPE '!' (backslash memutus literal string MySQL, B2);
  db.query selalu kembalikan list (PyMySQL tuple vs sqlite list, B3)
- docker-compose.yml: kontainer uji mariadb:11 (databisnisid-mariadb, 127.0.0.1:3306)
- test_mariadb.py: suite integrasi opt-in (skip bila bukan mysql)
- SPEC.md §V17/T17/B2/B3; AGENTS.md runbook
This commit is contained in:
proitlab committed 2026-08-05 12:41:17 +07:00
1 parent 063fb5e5eb
commit fdb5d0de15
12 files changed
+307 -79

No files matched your search

+11
View File
@@ -10,6 +10,17 @@ VEX_API_NODE=https://v2.vexascan.com:2096
# Lokasi file SQLite (disarankan absolut bila dijadwalkan via cron)
VEX_DB_PATH=voters.db
# Backend basis data: sqlite (default) atau mysql (MariaDB/MySQL via PyMySQL)
VEX_DB_BACKEND=sqlite
# Koneksi MariaDB/MySQL — dipakai saat VEX_DB_BACKEND=mysql
# Cocokkan dengan docker-compose.yml (MARIADB_DATABASE/USER/PASSWORD)
VEX_DB_HOST=127.0.0.1
VEX_DB_PORT=3306
VEX_DB_USER=databisnis
VEX_DB_PASS=databisnis
VEX_DB_NAME=databisnisid
# Syarat minimum stake (VEX) agar pemilih disimpan
VEX_MIN_STAKED_VEX=1000