-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathex_07_sqlalchemy_extended.py
More file actions
150 lines (116 loc) · 4.24 KB
/
ex_07_sqlalchemy_extended.py
File metadata and controls
150 lines (116 loc) · 4.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# Declarative-Variante wird hier benutzt
from flask import Flask, jsonify, render_template
from sqlalchemy import Column, Integer, String, create_engine, or_, ForeignKey, Table, select
from sqlalchemy.orm import scoped_session, sessionmaker,relationship
from sqlalchemy.ext.declarative import declarative_base
#from sqlalchemy.sql.expression import func
from dataclasses import dataclass
Base = declarative_base() # Basisklasse aller in SQLAlchemy verwendeten Klassen
metadata = Base.metadata
engine = create_engine('sqlite:///data/uni.sqlite', echo=True)
db_session = scoped_session(sessionmaker(autoflush=True, bind=engine))
Base.query = db_session.query_property() #Dadurch hat jedes Base - Objekt (also auch ein Millionaire) ein Attribut query für Abfragen
app = Flask(__name__) #Die Flask-Anwendung
@dataclass
class Assistenten(Base):
__tablename__ = 'Assistenten'
PerslNr:int
Name:str
Fachgebiet:str
professor_boss: object
PerslNr = Column(Integer, primary_key=True)
Name = Column(String(100), nullable=False)
Fachgebiet = Column(String(100), nullable=False)
Boss = Column(Integer, ForeignKey('Professoren.PersNr'), nullable=False)
professor_boss = relationship("Professoren", back_populates="assistenten")
@dataclass
class Professoren(Base):
__tablename__ = 'Professoren'
PersNr:int
Name : str
Rang: str
Raum: str
vorlesungen: object
PersNr = Column(Integer, primary_key=True)
Name = Column(String(100))
Rang = Column(String(100))
Raum = Column(String(100))
vorlesungen = relationship("Vorlesungen", back_populates="professor")
assistenten = relationship("Assistenten", back_populates="professor_boss")
hoeren = Table('hoeren',
Base.metadata,
Column('MatrNr', Integer, ForeignKey('Studenten.MatrNr')),
Column('VorlNr', Integer, ForeignKey('Vorlesungen.VorlNr'))
)
@dataclass
class Studenten(Base):
__tablename__ = 'Studenten'
MatrNr : int
Name : str
Semester : int
#vorlesungen :object
MatrNr = Column(Integer, primary_key=True)
Name = Column(String(100), nullable=False)
Semester = Column(Integer, nullable=False)
#vorlesungen = relationship('Vorlesungen', secondary=hoeren, backref='studenten')
@dataclass
class Vorlesungen(Base):
__tablename__ = 'Vorlesungen'
VorlNr:int
Titel:str
SWS:int
#professor: object
studenten: object
VorlNr = Column(Integer, primary_key=True)
Titel = Column(String(100), nullable=False)
SWS = Column(Integer, nullable=False)
gelesen_von = Column(Integer, ForeignKey('Professoren.PersNr'), nullable=False)
professor = relationship("Professoren", back_populates="vorlesungen")
studenten = relationship('Studenten', secondary=hoeren, backref='vorlesungen')
@app.route('/')
def home():
s = Studenten.query.all()
print(s)
return jsonify(s)
@app.route('/assistenten')
def assistenten():
res = Assistenten.query.all()
return jsonify(res)
@app.route('/professoren')
def professoren():
res = Professoren.query.all()
return jsonify(res)
@app.route('/vorlesungen')
def vorlesungen():
res = Vorlesungen.query.all()
for r in res:
print(r.professor.Name)
return jsonify(res)
@app.route('/studenten')
def studenten():
res = Studenten.query.all()
# for r in res:
# print(r.professor.Name)
return jsonify(res)
@app.route('/queries')
def queries():
res = Studenten.query.order_by(Studenten.Name).limit(3).all(); #sortiere nach dem Namen und hole die ersten 3
for r in res:
print(r.Name)
# See Examples : https://docs.sqlalchemy.org/en/14/orm/quickstart.html#simple-select
# and: https://docs.sqlalchemy.org/en/14/tutorial/data_select.html
stmt = select(Studenten).where(Studenten.Semester >= 12)
res = []
for x in db_session.scalars(stmt):
res.append({'Name' : x.Name, 'Semester' : x.Semester})
return jsonify(res)
@app.teardown_appcontext
def shutdown_session(exception=None):
print("Shutdown Session")
db_session.remove()
def init_db():
# Erzeugen der Tabellen für die Klassen, die oben deklariert sind (muss nicht sein, wenn diese schon existiert)
Base.metadata.create_all(bind=engine)
if __name__ == '__main__':
init_db()
app.run(debug=True, port=5001)