ZKRINET Docs
Byggblock

Import/export — din data ut och in, som CSV eller JSON

På Zkrinet: lägg till blocket under Byggblock i panelen — ett klick, din egen kod rörs inte och en ögonblicksbild tas först. Installationsstegen nedan gäller om du kör PocketBase själv, till exempel efter en export.

Frihetsprincipen i ett plugin: en superuser kan ta ut en hel samling som CSV (öppnas i Excel/Numbers/Google Kalkylark) eller JSON — och läsa in den igen, eller läsa in data från ett kalkylark. Importen är allt eller inget: blir en rad fel sparas ingenting.

Validering och sparande är PocketBases egna ($app.save i en transaktion) — samma kontroller som när du sparar i adminpanelen.

Testat mot PocketBase 0.40.4.

Installation

Kopiera pb_hooks/ till din PocketBase och starta om. Pluginet har inga egna samlingar.

Exportera

GET /api/zk/export/{samling}?format=csv|json     (superuser)
ParameterStandard
formatcsvcsv eller json
avgransarekommasemikolon ger ; — det Excel med svenska inställningar väntar sig
doldaav1 = ta med fält som är markerade som dolda. Lösenordshashar och tokenKey följer aldrig med, inte ens då.
// Från appen (superuser inloggad) — t.ex. en "Ladda ner"-knapp i en adminvy
const csv = await fetch(`${pb.baseURL}/api/zk/export/kunder?format=csv&avgransare=semikolon`, {
  headers: { Authorization: pb.authStore.token },
}).then((r) => r.blob())

Importera

POST /api/zk/import/{samling}?lage=skapa|uppsert&prova=1     (superuser)
Content-Type: text/csv          → kroppen är CSV
Content-Type: application/json  → kroppen är [ {...}, ... ]  eller  { "lage": "...", "prova": true, "poster": [ ... ] }
const fil = input.files[0]                       // en .csv från Excel
const svar = await fetch(`${pb.baseURL}/api/zk/import/kunder?lage=uppsert&prova=1`, {
  method: "POST",
  headers: { Authorization: pb.authStore.token, "Content-Type": "text/csv" },
  body: await fil.text(),
}).then((r) => r.json())
// { ok: true, lage: "uppsert", prova: true, rader: 120, skapade: 100, uppdaterade: 20, fel: [] }
// eller { ok: false, ..., fel: [ { rad: 7, fel: "epost: Must be a valid email address." } ] }
lage=skapa (standard)Varje rad blir en ny post. En rad med ett id som redan finns är ett fel.
lage=uppsertRad med ett id som finns → posten uppdateras (bara kolumnerna i filen ändras). Annars skapas den.
prova=1Torrkörning: allt valideras och provsparas i transaktionen — även unika nycklar — och rullas sedan alltid tillbaka. Sparar ingenting.

Säkerhet

Tak

Importkropp10 MiB. Servern läser högst så mycket och svarar 413 (mycket större kroppar kan få anslutningen stängd i stället).
Rader per import10 000 (413 över det)
Poster per export100 000 (413 — exportera i sidor via PocketBase vanliga API i stället)
Rapporterade radfel100, sedan avbryts valideringen (fler_fel: true)

Exporten och importen byggs i minnet. Större flyttar: dela upp filen.

Begränsningar — läs innan du lovar en kund något

Testa

./bank.py import-export

13 tester: rundresa JSON och CSV (knepiga värden, svenska tecken, emoji, relationer, fleraval, JSON, geo, datum, dolda fält) ger identiska data; Pythons egen CSV-läsare läser exporten rätt; semikolon och Excel-värden (decimalkomma, ja/nej); allt eller inget (både valideringsfel och unik nyckel i databasen); torrkörning; skapa/uppsert; okända kolumner och trasig CSV/JSON; gäster och användare nekas; systemsamlingar (namn och id), loggar och vyer nekas; dolda fält och lösenord; import av användare; filfält; taken. Skydden är mutantverifierade: 25 mutanter, 24 fångade. Den som överlever är vår vy-spärr — PocketBase vägrar själv att spara i en vy, så importen blir 400 ändå.