{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f3dc47df",
   "metadata": {},
   "source": [
    "# 22-26 · SQL и его отображение в ORM\n",
    "\n",
    "Практика к разделу [«ORM: работа с базой данных через объекты Python»](../../site/chapters/glava-22/22-26-orm.html)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3df21ac2",
   "metadata": {},
   "source": [
    "## Цель\n",
    "\n",
    "Проверить, что запрос через игрушечный ORM-объект и прямой SQL-запрос дают одинаковый результат — на маленьком, полностью реальном примере sqlite3."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "306acd8c",
   "metadata": {},
   "source": [
    "## Рабочий пример"
   ]
  },
  {
   "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": [
    "## Проверка результата"
   ]
  },
  {
   "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
}
