%Teilweise Erzeugt mit dem LaTeX-Generator: http://latex.sehnot.de

%Schriftgröße, Layout, Papierformat, Art des Dokumentes
\documentclass[10pt,oneside,a4paper]{scrartcl}

%Einstellungen der Seitenränder
\usepackage[left=2cm,right=2cm,top=1.5cm,bottom=1.5cm,includeheadfoot]{geometry}

%neue Rechtschreibung
\usepackage[ngerman]{babel}

%Umlaute ermöglichen
\usepackage[utf8]{inputenc}

%Gesamtseitenzahl
\usepackage{lastpage}

% Kopf- und Fußzeile
\usepackage[automark]{scrpage2}

%Quellcode-Listings
\usepackage{listings}

%Hyperlinks
\usepackage{hyperref}

%Spalten
\usepackage{multicol}

%Kopfzeile
\ihead{Python}
\chead{}
\ohead{http://kohnlehome.de/python/sqlalchemy.pdf}
\setheadsepline{0.5pt}

%Fußzeile
\setfootsepline{0.5pt}
\ifoot{Franz Kohnle}
\cfoot{Seite \thepage\ von  \pageref{LastPage}}
\ofoot{\today}

\pagestyle{scrheadings}

\begin{document}

% Überschrift 
\begin{center}
\LARGE % Schriftgröße
\bfseries % Fettdruck
\sffamily % Serifenlose Schrift
SQLAlchemy
\end{center}


\section*{Quellen}
\begin{itemize}
    \item \href{https://riptutorial.com/Download/sqlalchemy.pdf}{riptutorial: LEARNING sqlalchemy}
    \item \href{https://www.sqlalchemy.org/}{SQLAlchemy}
\end{itemize}

\section*{Installation}
\begin{verbatim}
pip install sqlalchemy
\end{verbatim}

\section*{SQLAlchemy-Core}
\subsection*{1. Verbindung zur Datenbank}
\begin{verbatim}
from sqlalchemy import create_engine
engine = create_engine('sqlite:///datenbank.db')
\end{verbatim}


\subsection*{2. Tabelle erstellen}
\begin{verbatim}
from sqlalchemy import Column, Integer, Text, MetaData, Table

metadata = MetaData()
schueler = Table(
    'schueler', metadata,
    Column('id', Integer, primary_key=True),
    Column('vorname', Text),
    Column('nachname', Text),
)
schueler.create(bind=engine)
\end{verbatim}

\subsection*{3. Datensätze einfügen}
\begin{verbatim}
insert_schueler = schueler.insert().values(vorname='Anna', nachname='Arm')
engine.execute(insert_schueler)
insert_schueler = schueler.insert().values(vorname='Berta', nachname='Bein')
engine.execute(insert_schueler)
\end{verbatim}

\subsection*{4. Datensätze lesen}
\begin{verbatim}
statement = select([schueler.c.vorname, schueler.c.nachname])
schuelerliste = engine.execute(statement).fetchall()
print(schuelerliste)
\end{verbatim}

\newpage

\section*{SQLAlchemy-ORM}
\subsection*{1. Verbindung zur Datenbank}
\begin{verbatim}
from sqlalchemy import create_engine
engine = create_engine('sqlite:///datenbank.db')
\end{verbatim}

\subsection*{2. Objektorientiertes Modell: Basis}
\begin{verbatim}
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
\end{verbatim}

\subsection*{3.a) Klassen: single table}
\begin{verbatim}
class Konto(Base):
    __tablename__ = "konto"
    id = Column(Integer, primary_key=True)
    kontostand = Column(Numeric(10, 2))
    type = Column(String(50))    
    __mapper_args__ = {"polymorphic_identity": "konto", "polymorphic_on": type}    
    
class Girokonto(Konto):
    dispo = Column(Numeric(10, 2))
    __mapper_args__ = {"polymorphic_identity": "girokonto"}    
    
class Sparkonto(Konto):
    zinssatz = Column(Numeric(10, 1))
    __mapper_args__ = {"polymorphic_identity": "sparkonto"}        
\end{verbatim}

\subsection*{3.b) Klassen: joined}
\begin{verbatim}
class Konto(Base):
    __tablename__ = "konto"
    id = Column(Integer, primary_key=True)
    kontostand = Column(Numeric(10, 2))
    type = Column(String(50))    
    __mapper_args__ = {"polymorphic_identity": "konto","polymorphic_on": type}    
    
class Girokonto(Konto):
    __tablename__ = "girokonto"
    id = Column(ForeignKey("konto.id"), primary_key=True)
    dispo = Column(Numeric(10, 2))
    __mapper_args__ = {"polymorphic_identity": "girokonto"}    
    
class Sparkonto(Konto):
    __tablename__ = "sparkonto"
    id = Column(ForeignKey("konto.id"), primary_key=True)
    zinssatz = Column(Numeric(10, 1))
    __mapper_args__ = {"polymorphic_identity": "sparkonto"}        
\end{verbatim}

\newpage

\subsection*{3.c) Klassen: table-per-class}
\begin{verbatim}
class Konto(Base):
    __tablename__ = "konto"
    id = Column(Integer, primary_key=True)
    kontostand = Column(Numeric(10, 2)) 
    __mapper_args__ = {"polymorphic_identity": "konto"}    
    
class Girokonto(Konto):
    __tablename__ = "girokonto"
    id = Column(Integer, primary_key=True)
    kontostand = Column(Numeric(10, 2))
    dispo = Column(Numeric(10, 2))
    __mapper_args__ = {"polymorphic_identity": "girokonto", "concrete": True}    
    
class Sparkonto(Konto):
    __tablename__ = "sparkonto"
    id = Column(Integer, primary_key=True)
    kontostand = Column(Numeric(10, 2))
    zinssatz = Column(Numeric(10, 1))
    __mapper_args__ = {"polymorphic_identity": "sparkonto", "concrete": True}        
\end{verbatim}

\subsection*{4. Datenbank und Tabellen erstellen}
\begin{verbatim}
Base.metadata.create_all(engine)    
\end{verbatim}

\subsection*{5. Python-Objekte erstellen}
\begin{verbatim}
konto1 = Konto(kontostand=11.11)
konto2 = Girokonto(kontostand=22.22, dispo=50.00)
konto3 = Sparkonto(kontostand=33.33, zinssatz=1.5)   
\end{verbatim}

\subsection*{6. Python-Objekte in Datenbank speichern}
\begin{verbatim}
from sqlalchemy.orm import Session

session = Session(engine)
session.add_all([konto1, konto2, konto3])
session.commit()
\end{verbatim}


\end{document}
