From 35938c8096cbd47ac637bba862be16de57d3ea7f Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 10:47:05 +0200 Subject: [PATCH 01/11] edited requirements.txt --- requirements.txt | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/requirements.txt b/requirements.txt index b5d18d7..e5cc163 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,8 +6,5 @@ # The pipeline needs the Azure Blob SDK and a Postgres driver. Add them below # with explicit pins. -# TODO: pin azure-storage-blob (uncomment and add a version) -# azure-storage-blob== - -# TODO: pin psycopg2-binary (uncomment and add a version) -# psycopg2-binary== +azure-storage-blob==12.29.0 +psycopg2-binary==2.9.0 From 9594854f2c9d08d1106016a9a9a0e6fb11b89f80 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 10:47:27 +0200 Subject: [PATCH 02/11] added upload raw to blob function --- src/pipeline.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/pipeline.py b/src/pipeline.py index ef1fc8a..283ef03 100644 --- a/src/pipeline.py +++ b/src/pipeline.py @@ -13,13 +13,22 @@ - Container Job: Data Track/Week 6/week_6__5_container_apps_jobs.md """ +import csv +import io +import json import logging import os from datetime import date +from zipfile import Path +import psycopg2 +from azure.storage.blob import BlobServiceClient +from contextlib import closing + logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") logger = logging.getLogger(__name__) + # TASK 3 hint: quiet the Azure SDK so its DEBUG output does not drown your own # pipeline logs. The right call lives in Chapter 5 (Viewing logs). @@ -62,7 +71,12 @@ def upload_raw_to_blob(records: list[dict], blob_conn_str: str, source: str) -> teacher has pre-created it). Overwrite if the blob already exists so same-day reruns succeed. """ - raise NotImplementedError("Task 1 + Task 3: upload records to blob storage") + service = BlobServiceClient.from_connection_string(blob_conn_str) + container = service.get_container_client("raw") + data = json.dumps(records) + blob_name = f"raw/{source}/{date.today().isoformat()}.json" + container.upload_blob(name=blob_name, data=data, overwrite=True) + return blob_name def write_to_postgres(records: list[dict], postgres_url: str) -> int: @@ -78,7 +92,6 @@ def write_to_postgres(records: list[dict], postgres_url: str) -> int: See Chapter 4 for the connection-and-cursor pattern this is based on. """ - raise NotImplementedError("Task 2 + Task 3: insert rows into Azure Postgres") def run() -> None: From cdcc7d4c79d730a7e2f3025793812c8c976cddd9 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 17:20:43 +0200 Subject: [PATCH 03/11] edited requirements --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index e5cc163..6254d1c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -7,4 +7,4 @@ # with explicit pins. azure-storage-blob==12.29.0 -psycopg2-binary==2.9.0 +psycopg2-binary==2.9.10 From 4d7fecc0514b989f56f4b94513d971f1282003e2 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 17:21:18 +0200 Subject: [PATCH 04/11] added docker file --- Dockerfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index ee3c978..3d48dc6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,6 +16,8 @@ WORKDIR /app # TODO Task 4: install dependencies with pip # TODO Task 4: copy the src/ folder - +COPY requirements.txt . +RUN pip install -r requirements.txt +COPY src/ ./src/ # TODO Task 4: set the CMD to run the pipeline (python -m src.pipeline) -CMD ["python", "-c", "raise SystemExit('Dockerfile not finished: Task 4 still pending')"] +CMD ["python", "-m", "src.pipeline"] From f95da11f5095750578010f95f83f5ce50f6ed043 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 17:21:50 +0200 Subject: [PATCH 05/11] added job confirmation --- docs/execution_history.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 docs/execution_history.txt diff --git a/docs/execution_history.txt b/docs/execution_history.txt new file mode 100644 index 0000000..01e1f45 --- /dev/null +++ b/docs/execution_history.txt @@ -0,0 +1,3 @@ +Name StartTime Status +---------------------------- ------------------------- --------- +noneeeed-weather-job-17t4zca 2026-06-10T14:55:41+00:00 Succeeded From 1a0c607015d595e36450241a953d96714392fbe3 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Wed, 10 Jun 2026 17:23:29 +0200 Subject: [PATCH 06/11] set azure logging to warning, finished pipeline (getconfig, write_to_postgres, fetch_records) --- src/pipeline.py | 71 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/src/pipeline.py b/src/pipeline.py index 283ef03..e9fc438 100644 --- a/src/pipeline.py +++ b/src/pipeline.py @@ -13,12 +13,11 @@ - Container Job: Data Track/Week 6/week_6__5_container_apps_jobs.md """ -import csv -import io import json import logging import os from datetime import date +import sys from zipfile import Path import psycopg2 from azure.storage.blob import BlobServiceClient @@ -27,7 +26,16 @@ logging.basicConfig(level=logging.INFO, format="%(levelname)s %(message)s") logger = logging.getLogger(__name__) - +logging.getLogger("azure").setLevel(logging.WARNING) + +CREATE_WEATHER_READINGS_SQL = """ +CREATE TABLE IF NOT EXISTS weather_readings ( + id SERIAL PRIMARY KEY, + station TEXT NOT NULL, + timestamp TIMESTAMPTZ NOT NULL, + temperature_c DOUBLE PRECISION NOT NULL +) +""" # TASK 3 hint: quiet the Azure SDK so its DEBUG output does not drown your own # pipeline logs. The right call lives in Chapter 5 (Viewing logs). @@ -46,9 +54,28 @@ def get_config() -> dict: Raise RuntimeError with a clear message if a required variable is missing. """ - raise NotImplementedError( - "Task 3: read POSTGRES_URL and AZURE_STORAGE_CONNECTION_STRING from os.environ" - ) + POSTGRES_URL = os.environ.get("POSTGRES_URL") + AZURE_STORAGE_CONNECTION_STRING = os.environ.get("AZURE_STORAGE_CONNECTION_STRING") + SOURCE_NAME = os.environ.get("SOURCE_NAME", "weather") + + missing = [] + if not POSTGRES_URL: + missing.append("POSTGRES_URL") + if not AZURE_STORAGE_CONNECTION_STRING: + missing.append("AZURE_STORAGE_CONNECTION_STRING") + if not SOURCE_NAME: + missing.append("SOURCE_NAME") + if missing: + print( + f"Error: missing environment variable(s): {', '.join(missing)}", + file=sys.stderr, + ) + sys.exit(1) + return { + "postgres_url": POSTGRES_URL, + "azure_storage_connection_string": AZURE_STORAGE_CONNECTION_STRING, + "source_name": SOURCE_NAME, + } def fetch_records() -> list[dict]: @@ -58,7 +85,20 @@ def fetch_records() -> list[dict]: one dict with a stable key set (for example: station, timestamp, temperature_c, humidity_pct). """ - raise NotImplementedError("Task 3: return a list of at least one record") + return [ + { + "station": "STATION_1", + "timestamp": "2024-06-01T12:00:00Z", + "temperature_c": 25.0, + "humidity_pct": 60.0, + }, + { + "station": "STATION_2", + "timestamp": "2024-06-01T12:05:00Z", + "temperature_c": 26.5, + "humidity_pct": 55.0, + }, + ] def upload_raw_to_blob(records: list[dict], blob_conn_str: str, source: str) -> str: @@ -74,7 +114,7 @@ def upload_raw_to_blob(records: list[dict], blob_conn_str: str, source: str) -> service = BlobServiceClient.from_connection_string(blob_conn_str) container = service.get_container_client("raw") data = json.dumps(records) - blob_name = f"raw/{source}/{date.today().isoformat()}.json" + blob_name = f"{source}/{date.today().isoformat()}.json" container.upload_blob(name=blob_name, data=data, overwrite=True) return blob_name @@ -92,6 +132,21 @@ def write_to_postgres(records: list[dict], postgres_url: str) -> int: See Chapter 4 for the connection-and-cursor pattern this is based on. """ + with closing(psycopg2.connect(postgres_url)) as conn: + with conn.cursor() as cur: + cur.execute("CREATE SCHEMA IF NOT EXISTS dev_bader;") + cur.execute("SET search_path TO dev_bader;") + cur.execute(CREATE_WEATHER_READINGS_SQL) + for row in records: + cur.execute( + """ + INSERT INTO weather_readings (station, timestamp, temperature_c) + VALUES (%s, %s, %s) + """, + (row["station"], row["timestamp"], float(row["temperature_c"])), + ) + conn.commit() + return len(records) def run() -> None: From eba70d807f4d05cd69a0cd2099cf22fd2e9bc491 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Thu, 11 Jun 2026 13:02:30 +0200 Subject: [PATCH 07/11] added missing png --- docs/execution_history.png | Bin 0 -> 104254 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/execution_history.png diff --git a/docs/execution_history.png b/docs/execution_history.png new file mode 100644 index 0000000000000000000000000000000000000000..c59da93207593476ef4d1d02bb28a4cfef573453 GIT binary patch literal 104254 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%0ACCv916wtFzVM^m?H+%0AAO|Rzk73>u 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%0ArN88UTQZQbl;_t0v41uj?RlK^~KR+xL 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 UrQGp5@Xa@dznMUDPTT$Ye_-Y^e*gdg literal 0 HcmV?d00001 From f57d52525de786f2876d20f85a46619ef7167356 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Thu, 11 Jun 2026 13:03:07 +0200 Subject: [PATCH 08/11] updated code to use on conflict in postgres --- src/pipeline.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/pipeline.py b/src/pipeline.py index e9fc438..5c7744f 100644 --- a/src/pipeline.py +++ b/src/pipeline.py @@ -5,7 +5,6 @@ Database for PostgreSQL. When you finish the assignment it will run as a Container App Job triggered from the Azure Portal or the CLI. -Replace every `raise NotImplementedError` below with a real implementation. Reference chapters: - Blob upload: Data Track/Week 6/week_6__3_azure_blob_storage.md @@ -18,6 +17,7 @@ import os from datetime import date import sys +from tkinter import ON from zipfile import Path import psycopg2 from azure.storage.blob import BlobServiceClient @@ -52,7 +52,6 @@ def get_config() -> dict: - SOURCE_NAME: logical source label, default "weather". - LOG_LEVEL: not parsed here; the orchestrator sets it via env var. - Raise RuntimeError with a clear message if a required variable is missing. """ POSTGRES_URL = os.environ.get("POSTGRES_URL") AZURE_STORAGE_CONNECTION_STRING = os.environ.get("AZURE_STORAGE_CONNECTION_STRING") @@ -66,9 +65,8 @@ def get_config() -> dict: if not SOURCE_NAME: missing.append("SOURCE_NAME") if missing: - print( - f"Error: missing environment variable(s): {', '.join(missing)}", - file=sys.stderr, + raise RuntimeError( + f"Error: missing environment variable(s): {', '.join(missing)}" ) sys.exit(1) return { @@ -137,15 +135,24 @@ def write_to_postgres(records: list[dict], postgres_url: str) -> int: cur.execute("CREATE SCHEMA IF NOT EXISTS dev_bader;") cur.execute("SET search_path TO dev_bader;") cur.execute(CREATE_WEATHER_READINGS_SQL) - for row in records: + for r in records: cur.execute( """ - INSERT INTO weather_readings (station, timestamp, temperature_c) - VALUES (%s, %s, %s) - """, - (row["station"], row["timestamp"], float(row["temperature_c"])), + INSERT INTO weather_readings (station, timestamp, temperature_c, humidity_pct) + VALUES (%s, %s, %s, %s) + ON CONFLICT (station, timestamp) DO UPDATE SET + temperature_c = EXCLUDED.temperature_c, + humidity_pct = EXCLUDED.humidity_pct, + ingested_at = NOW() + """, + ( + r["station"], + r["timestamp"], + r["temperature_c"], + r["humidity_pct"], + ), ) - conn.commit() + conn.commit() return len(records) From 01bedf6992f43548542226444fed7e41032cc407 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Thu, 11 Jun 2026 14:23:15 +0200 Subject: [PATCH 09/11] remade table to fit assignment requirements --- src/pipeline.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/pipeline.py b/src/pipeline.py index 5c7744f..2f76c21 100644 --- a/src/pipeline.py +++ b/src/pipeline.py @@ -16,9 +16,6 @@ import logging import os from datetime import date -import sys -from tkinter import ON -from zipfile import Path import psycopg2 from azure.storage.blob import BlobServiceClient from contextlib import closing @@ -29,13 +26,16 @@ logging.getLogger("azure").setLevel(logging.WARNING) CREATE_WEATHER_READINGS_SQL = """ -CREATE TABLE IF NOT EXISTS weather_readings ( - id SERIAL PRIMARY KEY, - station TEXT NOT NULL, - timestamp TIMESTAMPTZ NOT NULL, - temperature_c DOUBLE PRECISION NOT NULL -) -""" + CREATE TABLE IF NOT EXISTS weather_readings ( + id SERIAL PRIMARY KEY, + station TEXT NOT NULL, + timestamp TIMESTAMPTZ NOT NULL, + temperature_c DOUBLE PRECISION NOT NULL, + humidity_pct INTEGER NOT NULL, + ingested_at TIMESTAMPTZ DEFAULT NOW(), + UNIQUE(station, timestamp) + ) + """ # TASK 3 hint: quiet the Azure SDK so its DEBUG output does not drown your own # pipeline logs. The right call lives in Chapter 5 (Viewing logs). @@ -68,7 +68,6 @@ def get_config() -> dict: raise RuntimeError( f"Error: missing environment variable(s): {', '.join(missing)}" ) - sys.exit(1) return { "postgres_url": POSTGRES_URL, "azure_storage_connection_string": AZURE_STORAGE_CONNECTION_STRING, @@ -81,20 +80,20 @@ def fetch_records() -> list[dict]: In a real pipeline you would call an API here. Return a list of at least one dict with a stable key set (for example: station, timestamp, - temperature_c, humidity_pct). + temperature_c). """ return [ { "station": "STATION_1", "timestamp": "2024-06-01T12:00:00Z", "temperature_c": 25.0, - "humidity_pct": 60.0, + "humidity_pct": 60, }, { "station": "STATION_2", "timestamp": "2024-06-01T12:05:00Z", "temperature_c": 26.5, - "humidity_pct": 55.0, + "humidity_pct": 65, }, ] From ff81f18ae684e532682a7e0540f27b8d68086f19 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Thu, 11 Jun 2026 14:25:43 +0200 Subject: [PATCH 10/11] updated readme to include verify --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index fa94600..b0c8765 100644 --- a/README.md +++ b/README.md @@ -108,3 +108,32 @@ repo (`Data Track/Week 6/week_6__8_assignment.md`). The auto-grader checks code shape, not live Azure deployment, because the GitHub Actions runner has no Azure credentials. To rebuild from a fresh scaffold, follow `.agents/workflows/build_assignment_repo.md` in the curriculum repo. + +## Verification + +run using python -m src.pipeline +verify using: + +cur = conn.cursor() + +# Count rows +cur.execute("SELECT COUNT(*) FROM weather_readings") +count = cur.fetchone()[0] +print(f"Total rows: {count}") + +# Sample recent rows +cur.execute(""" + SELECT station, timestamp, temperature_c + FROM weather_readings + ORDER BY ingested_at DESC + LIMIT 2 +""") +for row in cur.fetchall(): + print(row) + +cur.close() + +OR using databeaver/bash using postgres link +Blob can be found in azure + +expect 2 rows written to postgres \ No newline at end of file From 05bfd6873641b3aa99a7b4f689bea67ba5f1af93 Mon Sep 17 00:00:00 2001 From: Mohamad Bader almsaddi alzin Date: Thu, 11 Jun 2026 14:29:06 +0200 Subject: [PATCH 11/11] added missing AI assist --- AI_ASSIST.md | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/AI_ASSIST.md b/AI_ASSIST.md index 9b31b94..878c87a 100644 --- a/AI_ASSIST.md +++ b/AI_ASSIST.md @@ -10,6 +10,8 @@ TODO: paste your prompt here. +() File "C:\Users\Bader\Desktop\w6\c55-data-week-6\src\pipeline.py", line 167, in run row_count = write_to_postgres(records, config["postgres_url"]) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Bader\Desktop\w6\c55-data-week-6\src\pipeline.py", line 136, in write_to_postgres cur.execute(CREATE_WEATHER_READINGS_SQL) psycopg2.errors.SyntaxError: syntax error at or near "(" LINE 7: UNIQUE(station, timestamp) + ## The code or suggestion it returned @@ -18,8 +20,77 @@ TODO: paste your prompt here. TODO: paste the AI output here. ``` +The error is occurring when PostgreSQL parses your CREATE TABLE statement: + +psycopg2.errors.SyntaxError: syntax error at or near "(" +LINE 7: UNIQUE(station, timestamp) + +This usually means the line before UNIQUE(...) is missing a comma. + +For example, this is invalid: + +CREATE TABLE weather_readings ( + station TEXT NOT NULL, + timestamp TIMESTAMP NOT NULL, + temperature NUMERIC NOT NULL + UNIQUE(station, timestamp) +); + +Notice the missing comma after temperature NUMERIC NOT NULL. + +It should be: + +CREATE TABLE weather_readings ( + station TEXT NOT NULL, + timestamp TIMESTAMP NOT NULL, + temperature NUMERIC NOT NULL, + UNIQUE(station, timestamp) +); + +Other common causes: + +1. Missing comma before a table constraint + +❌ + +humidity NUMERIC +UNIQUE(station, timestamp) + +✅ + +humidity NUMERIC, +UNIQUE(station, timestamp) +2. Using a reserved keyword + +timestamp is a PostgreSQL type name and can sometimes cause confusion as a column name. + +Safer: + +recorded_at TIMESTAMP NOT NULL + +or quote it: + +"timestamp" TIMESTAMP NOT NULL +3. Trailing syntax issue earlier in the statement + +For example: + +❌ + +temperature NUMERIC NOT NULL, +humidity NUMERIC, +, +UNIQUE(station, timestamp) + +The parser may only complain when it reaches UNIQUE. + +Please paste the full value of CREATE_WEATHER_READINGS_SQL (the entire SQL string around line 136), and I can point to the exact syntax error. + ## What I changed after reviewing it TODO: describe your review here. + + +found it immediatly it was an extra comma. fixed and moved on \ No newline at end of file