← back to Kravet Sheet Sync 2026 04 20
load_catalog_to_pg.py
91 lines
#!/usr/bin/env python3
"""Load kravet_image_catalog.jsonl into dw_unified.kravet_sku_images."""
import json, os, subprocess, csv, tempfile, re
SSH = ["ssh", "root@45.61.58.125"]
JSONL = "kravet_image_catalog.jsonl"
def pg_exec(sql):
subprocess.run(SSH + [
f'PGPASSWORD=DW2024! psql -h 127.0.0.1 -U dw_admin -d dw_unified -c "{sql}"'],
capture_output=True, text=True, check=True)
def norm_sku(s):
return re.sub(r"\.0$", "", re.sub(r"-", ".", s.strip().upper()))
def canonical_url(u):
"""Strip size params for dedup key."""
return re.sub(r"[?&](width|height|pad)=\w+", "", u).rstrip("?&")
# Setup schema
pg_exec("""
CREATE TABLE IF NOT EXISTS kravet_sku_images (
id serial PRIMARY KEY,
mfr_sku_norm text NOT NULL,
mfr_sku_raw text NOT NULL,
url text NOT NULL,
url_canonical text NOT NULL,
kind text NOT NULL,
source text NOT NULL,
product_url text,
product_name text,
created_at timestamptz DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_kravet_sku_images_norm ON kravet_sku_images(mfr_sku_norm);
CREATE INDEX IF NOT EXISTS idx_kravet_sku_images_kind ON kravet_sku_images(kind);
CREATE UNIQUE INDEX IF NOT EXISTS ux_kravet_sku_images_norm_canon
ON kravet_sku_images(mfr_sku_norm, url_canonical);
""")
# Write rows to CSV for COPY
rows = 0
skipped_dupes = 0
seen = set()
with tempfile.NamedTemporaryFile("w", suffix=".csv", delete=False, newline="") as tf:
w = csv.writer(tf)
with open(JSONL) as f:
for line in f:
r = json.loads(line)
if r["status"] != "ok":
continue
sku = r["sku"]
norm = norm_sku(sku)
alg = r.get("algolia") or {}
purl = alg.get("url")
pname = alg.get("name")
for u in r["urls"]:
cu = canonical_url(u["url"])
key = (norm, cu)
if key in seen:
skipped_dupes += 1
continue
seen.add(key)
w.writerow([norm, sku, u["url"], cu, u["kind"], u["source"], purl or "", pname or ""])
rows += 1
tmp = tf.name
print(f"csv: {rows:,} rows ({skipped_dupes:,} in-file dupes)")
# Ship to Kamatera and COPY in
subprocess.run(["scp", tmp, "root@45.61.58.125:/tmp/kravet_images_load.csv"], check=True)
pg_exec("TRUNCATE kravet_sku_images")
subprocess.run(SSH + ["""PGPASSWORD=DW2024! psql -h 127.0.0.1 -U dw_admin -d dw_unified <<'SQL'
\\copy kravet_sku_images (mfr_sku_norm, mfr_sku_raw, url, url_canonical, kind, source, product_url, product_name) FROM '/tmp/kravet_images_load.csv' WITH (FORMAT csv);
SELECT COUNT(*) AS rows, COUNT(DISTINCT mfr_sku_norm) AS skus FROM kravet_sku_images;
SELECT kind, COUNT(*) FROM kravet_sku_images GROUP BY kind ORDER BY COUNT(*) DESC;
SELECT 'coverage' AS metric, COUNT(DISTINCT s.mfr_sku_norm) AS sheet_wallcovers,
COUNT(DISTINCT i.mfr_sku_norm) AS skus_with_at_least_one_image,
COUNT(DISTINCT s.mfr_sku_norm) - COUNT(DISTINCT i.mfr_sku_norm) AS missing
FROM kravet_sheet_fields s
LEFT JOIN kravet_sku_images i ON i.mfr_sku_norm = s.mfr_sku_norm
WHERE upper(COALESCE(s.use,'')) LIKE '%WALL%';
SQL
"""], check=True)
os.unlink(tmp)
print("done")