{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f3dc47df",
   "metadata": {},
   "source": [
    "# 22-26 · SQL i jego wyświetlanie w ORM\n",
    "\n",
    "Praktyka do sekcji [„ORM: pracy z bazą danych przez Python obiekty”"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3df21ac2",
   "metadata": {},
   "source": [
    "## Cel\n",
    "\n",
    "Sprawdź, czy zapytanie przez obiekt zabawkowy ORM- oraz bezpośrednie żądanie SQL- dają ten sam wynik — używając małego, całkowicie realistycznego przykładu sqlite3."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "306acd8c",
   "metadata": {},
   "source": [
    "## Sprawa robocza"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a2aff676",
   "metadata": {},
   "outputs": [],
   "source": [
    "import sqlite3\n",
    "\n",
    "baza = sqlite3.connect(\":memory:\")\n",
    "baza.row_factory = sqlite3.Row\n",
    "baza.execute(\"CREATE TABLE tasks (id INTEGER PRIMARY KEY, title TEXT NOT NULL, done INTEGER NOT NULL DEFAULT 0)\")\n",
    "baza.executemany(\n",
    "    \"INSERT INTO tasks (title, done) VALUES (?, ?)\",\n",
    "    [(\"A\", 0), (\"B\", 1), (\"C\", 0)],\n",
    ")\n",
    "baza.commit()\n",
    "\n",
    "\n",
    "class ProstoyORM:\n",
    "    \"\"\"Игрушечная имитация одного метода ORM: формирует и выполняет обычный SQL.\"\"\"\n",
    "\n",
    "    def __init__(self, soedinenie):\n",
    "        self.soedinenie = soedinenie\n",
    "\n",
    "    def nevypolnennye(self):\n",
    "        return self.soedinenie.execute(\n",
    "            \"SELECT id, title, done FROM tasks WHERE done = 0 ORDER BY id\"\n",
    "        ).fetchall()\n",
    "\n",
    "\n",
    "orm = ProstoyORM(baza)\n",
    "cherez_orm = orm.nevypolnennye()\n",
    "cherez_sql = baza.execute(\"SELECT id, title, done FROM tasks WHERE done = 0 ORDER BY id\").fetchall()\n",
    "\n",
    "print([dict(s) for s in cherez_orm])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf918de8",
   "metadata": {},
   "source": [
    "## Sprawdzenie wyniku"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1af31ba1",
   "metadata": {},
   "outputs": [],
   "source": [
    "assert [dict(s) for s in cherez_orm] == [dict(s) for s in cherez_sql]\n",
    "assert [s[\"title\"] for s in cherez_orm] == [\"A\", \"C\"]\n",
    "print(\"Верно: ORM-обёртка и прямой SQL-запрос вернули одинаковый результат — ORM формирует тот же SQL.\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Cartesian Python 3.14",
   "language": "python",
   "name": "cartesian-python314"
  },
  "language_info": {
   "name": "python",
   "version": "3.14.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
