From c0487f22a9d0b85d12868e91a9e17a833e8dd351 Mon Sep 17 00:00:00 2001 From: Simeon Simeonov Date: Tue, 20 Sep 2022 15:44:45 +0200 Subject: Add reflection example in notebooks/sqlalchemy/sqlalchemy.ipynb --- notebooks/sqlalchemy/sqlalchemy.ipynb | 359 +++++++++++++++++++++++++++------- 1 file changed, 288 insertions(+), 71 deletions(-) diff --git a/notebooks/sqlalchemy/sqlalchemy.ipynb b/notebooks/sqlalchemy/sqlalchemy.ipynb index f2f65cc..ce0070c 100644 --- a/notebooks/sqlalchemy/sqlalchemy.ipynb +++ b/notebooks/sqlalchemy/sqlalchemy.ipynb @@ -2,8 +2,11 @@ "cells": [ { "cell_type": "markdown", - "id": "f37249e7-a474-407f-ae2e-17def087bd72", + "id": "8d981972-51c1-4f44-98fb-47abefacffb7", "metadata": { + "slideshow": { + "slide_type": "slide" + }, "tags": [] }, "source": [ @@ -22,7 +25,11 @@ { "cell_type": "markdown", "id": "19d6fced-434e-4604-bcb7-b71fadfe6dcb", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "# What is SQLAlchemy?\n", "\n", @@ -34,7 +41,11 @@ { "cell_type": "markdown", "id": "fa5ad88f-d2ec-4d86-9982-73f7b9fe0e9b", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "# Why use SQLAlchemy?\n", "\n", @@ -56,12 +67,14 @@ { "cell_type": "markdown", "id": "d68798f0-de17-44f9-b677-d7ee06409a9c", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "source": [ "# Basic architecture\n", "\n", - "SQLAlchemy consists of several components, including the ORM.\n", - "\n", "- Engine- manages the connection pool and the RDBMS-independent SQL dialect layer\n", "\n", "- MetaData - used to collect and organize information about your table layout (schema)\n", @@ -77,9 +90,13 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 12, "id": "d1ea9f51-e3de-45a8-8302-b4a89b5d1689", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, "outputs": [], "source": [ "from sqlalchemy import create_engine\n", @@ -97,28 +114,32 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 13, "id": "3b4a777d-7d38-4149-8ab2-c876e2533766", - "metadata": {}, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-19 15:33:48,105 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", - "2022-09-19 15:33:48,106 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"production_types\")\n", - "2022-09-19 15:33:48,107 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,108 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"production_types\")\n", - "2022-09-19 15:33:48,108 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,110 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"bidding_areas\")\n", - "2022-09-19 15:33:48,110 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,112 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"bidding_areas\")\n", - "2022-09-19 15:33:48,112 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,113 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"production_plans\")\n", - "2022-09-19 15:33:48,113 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,115 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"production_plans\")\n", - "2022-09-19 15:33:48,115 INFO sqlalchemy.engine.Engine [raw sql] ()\n", - "2022-09-19 15:33:48,117 INFO sqlalchemy.engine.Engine \n", + "2022-09-20 15:40:36,125 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", + "2022-09-20 15:40:36,126 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"production_types\")\n", + "2022-09-20 15:40:36,126 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,127 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"production_types\")\n", + "2022-09-20 15:40:36,128 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,129 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"bidding_areas\")\n", + "2022-09-20 15:40:36,129 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,130 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"bidding_areas\")\n", + "2022-09-20 15:40:36,131 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,132 INFO sqlalchemy.engine.Engine PRAGMA main.table_info(\"production_plans\")\n", + "2022-09-20 15:40:36,132 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,133 INFO sqlalchemy.engine.Engine PRAGMA temp.table_info(\"production_plans\")\n", + "2022-09-20 15:40:36,134 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,136 INFO sqlalchemy.engine.Engine \n", "CREATE TABLE production_types (\n", "\tproduction_type_id INTEGER NOT NULL, \n", "\tcode VARCHAR(3) NOT NULL, \n", @@ -128,8 +149,8 @@ ")\n", "\n", "\n", - "2022-09-19 15:33:48,117 INFO sqlalchemy.engine.Engine [no key 0.00045s] ()\n", - "2022-09-19 15:33:48,119 INFO sqlalchemy.engine.Engine \n", + "2022-09-20 15:40:36,137 INFO sqlalchemy.engine.Engine [no key 0.00055s] ()\n", + "2022-09-20 15:40:36,138 INFO sqlalchemy.engine.Engine \n", "CREATE TABLE bidding_areas (\n", "\tbidding_area_id INTEGER NOT NULL, \n", "\tcode VARCHAR(3) NOT NULL, \n", @@ -139,8 +160,8 @@ ")\n", "\n", "\n", - "2022-09-19 15:33:48,119 INFO sqlalchemy.engine.Engine [no key 0.00051s] ()\n", - "2022-09-19 15:33:48,121 INFO sqlalchemy.engine.Engine \n", + "2022-09-20 15:40:36,138 INFO sqlalchemy.engine.Engine [no key 0.00049s] ()\n", + "2022-09-20 15:40:36,140 INFO sqlalchemy.engine.Engine \n", "CREATE TABLE production_plans (\n", "\trecord_created_time DATETIME NOT NULL, \n", "\tstart_time DATETIME NOT NULL, \n", @@ -153,18 +174,16 @@ ")\n", "\n", "\n", - "2022-09-19 15:33:48,122 INFO sqlalchemy.engine.Engine [no key 0.00095s] ()\n", - "2022-09-19 15:33:48,123 INFO sqlalchemy.engine.Engine COMMIT\n" + "2022-09-20 15:40:36,141 INFO sqlalchemy.engine.Engine [no key 0.00068s] ()\n", + "2022-09-20 15:40:36,142 INFO sqlalchemy.engine.Engine COMMIT\n" ] } ], "source": [ - "from sqlalchemy import Column, MetaData, Table\n", + "from sqlalchemy import Column, Table\n", "from sqlalchemy import DateTime, ForeignKey, Integer, Numeric, String\n", "from sqlalchemy.orm import relationship\n", "\n", - "metadata = MetaData()\n", - "\n", "from sqlalchemy.ext.declarative import declarative_base\n", "\n", "Base = declarative_base()\n", @@ -185,6 +204,12 @@ " self.code = code\n", " self.description = description\n", "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", " def __str__(self):\n", " return self.code\n", "\n", @@ -204,6 +229,12 @@ " self.code = code\n", " self.name = name\n", "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", " def __str__(self):\n", " return self.code\n", "\n", @@ -229,6 +260,15 @@ " self.bidding_area = bidding_area # a 'BiddingArea' object\n", " self.value = value\n", "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", " def __str__(self):\n", " return (\n", " f\"{self.record_created_time} {self.start_time} \"\n", @@ -238,52 +278,218 @@ "Base.metadata.create_all(engine) # create tables\n" ] }, + { + "cell_type": "markdown", + "id": "ab7e9561-2780-4d85-843c-b217d15ee4c8", + "metadata": {}, + "source": [ + "# Reflection\n", + "\n", + "*Table* object can be instructed to load information about itself from the corresponding database schema object already existing within the database.\n", + "This process is called *reflection*.\n", + "\n", + "If the DB schema is already defined and maintained \"somewhere else\", it may be useful to \"reflect\" the schema instead of explicitly defining it." + ] + }, { "cell_type": "code", - "execution_count": 3, - "id": "1f18d9c1-bd39-4195-b868-114c3296eac2", + "execution_count": 14, + "id": "70b0c5fa-35ae-44b5-b57b-2fa21b4f7da5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2022-09-19 15:33:48,160 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", - "2022-09-19 15:33:48,163 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", - "2022-09-19 15:33:48,164 INFO sqlalchemy.engine.Engine [generated in 0.00128s] ('NO1', 'Elspot NO1')\n", - "2022-09-19 15:33:48,166 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", - "2022-09-19 15:33:48,167 INFO sqlalchemy.engine.Engine [cached since 0.003926s ago] ('NO2', 'Elspot NO2')\n", - "2022-09-19 15:33:48,168 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", - "2022-09-19 15:33:48,169 INFO sqlalchemy.engine.Engine [cached since 0.005792s ago] ('NO3', 'Elspot NO3')\n", - "2022-09-19 15:33:48,170 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", - "2022-09-19 15:33:48,171 INFO sqlalchemy.engine.Engine [cached since 0.007965s ago] ('NO4', 'Elspot NO4')\n", - "2022-09-19 15:33:48,172 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", - "2022-09-19 15:33:48,172 INFO sqlalchemy.engine.Engine [cached since 0.009323s ago] ('NO5', 'Elspot NO5')\n", - "2022-09-19 15:33:48,174 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,175 INFO sqlalchemy.engine.Engine [generated in 0.00066s] ('B19', 'Wind Onshore')\n", - "2022-09-19 15:33:48,176 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,177 INFO sqlalchemy.engine.Engine [cached since 0.002644s ago] ('B10', 'Hydro-electric pure pumped storage head installation')\n", - "2022-09-19 15:33:48,178 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,178 INFO sqlalchemy.engine.Engine [cached since 0.004299s ago] ('B11', 'Hydro Run-of-river head installation')\n", - "2022-09-19 15:33:48,179 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,180 INFO sqlalchemy.engine.Engine [cached since 0.005933s ago] ('B12', 'Hydro-electric storage head installation')\n", - "2022-09-19 15:33:48,181 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,181 INFO sqlalchemy.engine.Engine [cached since 0.007409s ago] ('A04', 'Generation')\n", - "2022-09-19 15:33:48,183 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,183 INFO sqlalchemy.engine.Engine [cached since 0.009187s ago] ('B37', 'Thermal unspecified')\n", - "2022-09-19 15:33:48,184 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", - "2022-09-19 15:33:48,184 INFO sqlalchemy.engine.Engine [cached since 0.01042s ago] ('B30', 'Wind unspecified')\n", - "2022-09-19 15:33:48,187 INFO sqlalchemy.engine.Engine INSERT INTO production_plans (record_created_time, start_time, bidding_area_id, production_type_id, value) VALUES (?, ?, ?, ?, ?)\n", - "2022-09-19 15:33:48,187 INFO sqlalchemy.engine.Engine [generated in 0.00072s] (('2022-09-19 15:33:48.159940', '2022-11-02 01:00:00.000000', 1, 6, 80.5), ('2022-09-19 15:33:48.160093', '2022-11-02 02:00:00.000000', 1, 6, 90.5))\n", - "2022-09-19 15:33:48,189 INFO sqlalchemy.engine.Engine COMMIT\n", - "2022-09-19 15:33:48,191 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", - "2022-09-19 15:33:48,194 INFO sqlalchemy.engine.Engine SELECT production_plans.record_created_time AS production_plans_record_created_time, production_plans.start_time AS production_plans_start_time, production_plans.bidding_area_id AS production_plans_bidding_area_id, production_plans.production_type_id AS production_plans_production_type_id \n", + "2022-09-20 15:40:36,151 INFO sqlalchemy.engine.Engine PRAGMA main.table_xinfo(\"production_types\")\n", + "2022-09-20 15:40:36,152 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,153 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,153 INFO sqlalchemy.engine.Engine [raw sql] ('production_types',)\n", + "2022-09-20 15:40:36,155 INFO sqlalchemy.engine.Engine PRAGMA main.foreign_key_list(\"production_types\")\n", + "2022-09-20 15:40:36,156 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,157 INFO sqlalchemy.engine.Engine PRAGMA temp.foreign_key_list(\"production_types\")\n", + "2022-09-20 15:40:36,158 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,160 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,160 INFO sqlalchemy.engine.Engine [raw sql] ('production_types',)\n", + "2022-09-20 15:40:36,161 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"production_types\")\n", + "2022-09-20 15:40:36,162 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,163 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"production_types\")\n", + "2022-09-20 15:40:36,164 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,165 INFO sqlalchemy.engine.Engine PRAGMA main.index_info(\"sqlite_autoindex_production_types_1\")\n", + "2022-09-20 15:40:36,166 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,168 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,169 INFO sqlalchemy.engine.Engine [raw sql] ('production_types',)\n", + "2022-09-20 15:40:36,171 INFO sqlalchemy.engine.Engine PRAGMA main.table_xinfo(\"bidding_areas\")\n", + "2022-09-20 15:40:36,172 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,173 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,174 INFO sqlalchemy.engine.Engine [raw sql] ('bidding_areas',)\n", + "2022-09-20 15:40:36,175 INFO sqlalchemy.engine.Engine PRAGMA main.foreign_key_list(\"bidding_areas\")\n", + "2022-09-20 15:40:36,176 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,176 INFO sqlalchemy.engine.Engine PRAGMA temp.foreign_key_list(\"bidding_areas\")\n", + "2022-09-20 15:40:36,177 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,179 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,179 INFO sqlalchemy.engine.Engine [raw sql] ('bidding_areas',)\n", + "2022-09-20 15:40:36,181 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"bidding_areas\")\n", + "2022-09-20 15:40:36,181 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,182 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"bidding_areas\")\n", + "2022-09-20 15:40:36,183 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,184 INFO sqlalchemy.engine.Engine PRAGMA main.index_info(\"sqlite_autoindex_bidding_areas_1\")\n", + "2022-09-20 15:40:36,185 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,186 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,186 INFO sqlalchemy.engine.Engine [raw sql] ('bidding_areas',)\n", + "2022-09-20 15:40:36,189 INFO sqlalchemy.engine.Engine PRAGMA main.table_xinfo(\"production_plans\")\n", + "2022-09-20 15:40:36,189 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,191 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,191 INFO sqlalchemy.engine.Engine [raw sql] ('production_plans',)\n", + "2022-09-20 15:40:36,193 INFO sqlalchemy.engine.Engine PRAGMA main.foreign_key_list(\"production_plans\")\n", + "2022-09-20 15:40:36,194 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,195 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,196 INFO sqlalchemy.engine.Engine [raw sql] ('production_plans',)\n", + "2022-09-20 15:40:36,197 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"production_plans\")\n", + "2022-09-20 15:40:36,197 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,199 INFO sqlalchemy.engine.Engine PRAGMA main.index_list(\"production_plans\")\n", + "2022-09-20 15:40:36,199 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,200 INFO sqlalchemy.engine.Engine PRAGMA main.index_info(\"sqlite_autoindex_production_plans_1\")\n", + "2022-09-20 15:40:36,201 INFO sqlalchemy.engine.Engine [raw sql] ()\n", + "2022-09-20 15:40:36,202 INFO sqlalchemy.engine.Engine SELECT sql FROM (SELECT * FROM sqlite_master UNION ALL SELECT * FROM sqlite_temp_master) WHERE name = ? AND type = 'table'\n", + "2022-09-20 15:40:36,202 INFO sqlalchemy.engine.Engine [raw sql] ('production_plans',)\n" + ] + } + ], + "source": [ + "from sqlalchemy.ext.declarative import declarative_base\n", + "\n", + "Base = declarative_base()\n", + "Base.metadata.bind = engine\n", + "\n", + "\n", + "class ProductionType(Base):\n", + " __tablename__ = \"production_types\"\n", + " __table_args__ = {\"autoload\": True}\n", + "\n", + " # override the existing 'description'...\n", + " description = Column(String(64))\n", + "\n", + " production_plans = relationship(\n", + " \"ProductionPlan\", back_populates=\"production_type\", lazy=\"dynamic\"\n", + " )\n", + "\n", + " def __init__(self, code, description):\n", + " self.code = code\n", + " self.description = description\n", + "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", + " def __str__(self):\n", + " return self.code\n", + "\n", + "\n", + "class BiddingArea(Base):\n", + " __tablename__ = \"bidding_areas\"\n", + " __table_args__ = {\"autoload\": True}\n", + "\n", + " production_plans = relationship(\n", + " \"ProductionPlan\", back_populates=\"bidding_area\", lazy=\"dynamic\"\n", + " )\n", + "\n", + " def __init__(self, code, name):\n", + " self.code = code\n", + " self.name = name\n", + "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", + " def __str__(self):\n", + " return self.code\n", + "\n", + "\n", + "class ProductionPlan(Base):\n", + " __tablename__ = \"production_plans\"\n", + " __table_args__ = {\"autoload\": True}\n", + "\n", + " production_type = relationship(ProductionType, back_populates=\"production_plans\")\n", + " bidding_area = relationship(BiddingArea, back_populates=\"production_plans\")\n", + "\n", + " def __init__(self, record_created_time, start_time, production_type, bidding_area, value):\n", + " self.record_created_time = record_created_time\n", + " self.start_time = start_time\n", + " self.production_type = production_type # a 'ProductionType' object\n", + " self.bidding_area = bidding_area # a 'BiddingArea' object\n", + " self.value = value\n", + "\n", + " def __repr__(self):\n", + " return (\n", + " f\"\"\n", + " )\n", + "\n", + " def __str__(self):\n", + " return (\n", + " f\"{self.record_created_time} {self.start_time} \"\n", + " f\"{self.production_type} {self.bidding_area} {self.value}\"\n", + " )\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "1f18d9c1-bd39-4195-b868-114c3296eac2", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "2022-09-20 15:40:36,217 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", + "2022-09-20 15:40:36,219 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", + "2022-09-20 15:40:36,219 INFO sqlalchemy.engine.Engine [generated in 0.00067s] ('NO1', 'Elspot NO1')\n", + "2022-09-20 15:40:36,221 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", + "2022-09-20 15:40:36,221 INFO sqlalchemy.engine.Engine [cached since 0.002563s ago] ('NO2', 'Elspot NO2')\n", + "2022-09-20 15:40:36,222 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", + "2022-09-20 15:40:36,223 INFO sqlalchemy.engine.Engine [cached since 0.004114s ago] ('NO3', 'Elspot NO3')\n", + "2022-09-20 15:40:36,224 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", + "2022-09-20 15:40:36,224 INFO sqlalchemy.engine.Engine [cached since 0.0056s ago] ('NO4', 'Elspot NO4')\n", + "2022-09-20 15:40:36,226 INFO sqlalchemy.engine.Engine INSERT INTO bidding_areas (code, name) VALUES (?, ?)\n", + "2022-09-20 15:40:36,226 INFO sqlalchemy.engine.Engine [cached since 0.007587s ago] ('NO5', 'Elspot NO5')\n", + "2022-09-20 15:40:36,228 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,228 INFO sqlalchemy.engine.Engine [generated in 0.00059s] ('B19', 'Wind Onshore')\n", + "2022-09-20 15:40:36,229 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,230 INFO sqlalchemy.engine.Engine [cached since 0.002172s ago] ('B10', 'Hydro-electric pure pumped storage head installation')\n", + "2022-09-20 15:40:36,231 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,232 INFO sqlalchemy.engine.Engine [cached since 0.003747s ago] ('B11', 'Hydro Run-of-river head installation')\n", + "2022-09-20 15:40:36,233 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,233 INFO sqlalchemy.engine.Engine [cached since 0.00528s ago] ('B12', 'Hydro-electric storage head installation')\n", + "2022-09-20 15:40:36,234 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,234 INFO sqlalchemy.engine.Engine [cached since 0.006383s ago] ('A04', 'Generation')\n", + "2022-09-20 15:40:36,236 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,236 INFO sqlalchemy.engine.Engine [cached since 0.00839s ago] ('B37', 'Thermal unspecified')\n", + "2022-09-20 15:40:36,237 INFO sqlalchemy.engine.Engine INSERT INTO production_types (code, description) VALUES (?, ?)\n", + "2022-09-20 15:40:36,238 INFO sqlalchemy.engine.Engine [cached since 0.009993s ago] ('B30', 'Wind unspecified')\n", + "2022-09-20 15:40:36,240 INFO sqlalchemy.engine.Engine INSERT INTO production_plans (record_created_time, start_time, bidding_area_id, production_type_id, value) VALUES (?, ?, ?, ?, ?)\n", + "2022-09-20 15:40:36,241 INFO sqlalchemy.engine.Engine [generated in 0.00109s] (('2022-09-20 15:40:36.216893', '2022-11-02 01:00:00.000000', 1, 6, 80.5), ('2022-09-20 15:40:36.217038', '2022-11-02 02:00:00.000000', 1, 6, 90.5))\n", + "2022-09-20 15:40:36,242 INFO sqlalchemy.engine.Engine COMMIT\n", + "2022-09-20 15:40:36,243 INFO sqlalchemy.engine.Engine BEGIN (implicit)\n", + "2022-09-20 15:40:36,245 INFO sqlalchemy.engine.Engine SELECT production_plans.record_created_time AS production_plans_record_created_time, production_plans.start_time AS production_plans_start_time, production_plans.bidding_area_id AS production_plans_bidding_area_id, production_plans.production_type_id AS production_plans_production_type_id \n", "FROM production_plans \n", "WHERE production_plans.record_created_time = ? AND production_plans.start_time = ? AND production_plans.bidding_area_id = ? AND production_plans.production_type_id = ?\n", - "2022-09-19 15:33:48,195 INFO sqlalchemy.engine.Engine [generated in 0.00095s] ('2022-09-19 15:33:48.160093', '2022-11-02 02:00:00.000000', 1, 6)\n", - "2022-09-19 15:33:48,197 INFO sqlalchemy.engine.Engine UPDATE production_plans SET value=? WHERE production_plans.record_created_time = ? AND production_plans.start_time = ? AND production_plans.bidding_area_id = ? AND production_plans.production_type_id = ?\n", - "2022-09-19 15:33:48,198 INFO sqlalchemy.engine.Engine [generated in 0.00097s] (70.5, '2022-09-19 15:33:48.160093', '2022-11-02 02:00:00.000000', 1, 6)\n", - "2022-09-19 15:33:48,199 INFO sqlalchemy.engine.Engine COMMIT\n" + "2022-09-20 15:40:36,246 INFO sqlalchemy.engine.Engine [generated in 0.00069s] ('2022-09-20 15:40:36.217038', '2022-11-02 02:00:00.000000', 1, 6)\n", + "2022-09-20 15:40:36,248 INFO sqlalchemy.engine.Engine UPDATE production_plans SET value=? WHERE production_plans.record_created_time = ? AND production_plans.start_time = ? AND production_plans.bidding_area_id = ? AND production_plans.production_type_id = ?\n", + "2022-09-20 15:40:36,248 INFO sqlalchemy.engine.Engine [generated in 0.00064s] (70.5, '2022-09-20 15:40:36.217038', '2022-11-02 02:00:00.000000', 1, 6)\n", + "2022-09-20 15:40:36,249 INFO sqlalchemy.engine.Engine COMMIT\n" ] } ], @@ -298,7 +504,7 @@ "session = Session()\n", "\n", "bidding_area1 = BiddingArea(\"NO1\", \"Elspot NO1\")\n", - "session.add(bidding_area1)\n", + "session.add(bidding_area1),\n", "\n", "session.add_all(\n", " [\n", @@ -307,7 +513,7 @@ " BiddingArea(\"NO4\", \"Elspot NO4\"),\n", " BiddingArea(\"NO5\", \"Elspot NO5\"),\n", " ]\n", - ")\n", + "),\n", "\n", "production_type_B37 = ProductionType(\"B37\", \"Thermal unspecified\")\n", "production_type_B30 = ProductionType(\"B30\", \"Wind unspecified\")\n", @@ -353,9 +559,20 @@ "\n", "session.commit()\n" ] + }, + { + "cell_type": "markdown", + "id": "86336aaa-540c-466d-b5c1-f3fc179bd1e3", + "metadata": {}, + "source": [ + "# TODO\n", + "\n", + "- reflection\n" + ] } ], "metadata": { + "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", -- cgit v1.3