• Liebe User mit web.de oder gmx.de E-Mail-Adressen: Bitte ändert eure Adressen, da wir nicht garantieren können das E-Mails vom Forum an euch ankommen. Genaueres dazu im Feedbackforum
  • Liebe Community,
    am 21.04.2021 wird unsere Domain in ein neues Rechenzentrum umziehen.
    Daher wird das Forum zwischen 00:00 und 04:00 Uhr nicht unter broodwar.net erreichbar sein,
    stattdessen könnt ihr das Forum unter https://85.214.102.212/forum/ ansurfen. Beachtet dabei bitte, dass ihr euch dafür extra einloggen müsst.
    Sobald alles erledigt ist, sind wir ganz normal wieder erreichbar.

REST API Amadeus Nutzung

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Hab gerade doch etwas Leerlauf dank Corona für Spaß Projekte und Sachen die eher nice to have wären.
Man könnte der Meinung sein, dass sowas irgendjemand im Team Bund schon weiß oder macht, aber so ist das in großen Institutionen wohl immer.

Ich würde gerne die API von Amadeus nutzen um Flugpreise für verschiedene Origin/Destination (OD) zu nutzen. z.B. Köln-Berlin.
Das könnte ich für gewisse Studien gebrauchen.
https://developers.amadeus.com/self-service/apis-docs/code-samples/documentation/10

Frage ist jetzt was brauche ich alles (und was kostet es), um sowas so zu bauen, dass ich das regelmäßig laufen lassen kann ohne es von meinem Computer direkt zu machen. Also Remote Rechner, Datenbank etc.
Und für Shi natürlich, wie mache ich es halbwegs sicher :ugly:

1. Software mit Python wäre wohl umsonst.
2. Was kostet ne kleine Datenbank? Und wo krieg ich die her
3. Remoterechner?

Solange sich die kosten unter 100-200€ Jahr bewegen, würde ich das wohl privat auslegen, um sowas zu lernen.
 
Mitglied seit
21.09.2001
Beiträge
3.433
Reaktionen
1.999
1. RaspberryPi
2. SQLite drauf
3. Requests
4. Cronjob oder Airflow zum Queue-Management

40€ Anschaffung > Raspberry PI 4
unter 10€ Strom im Jahr, würde ich jetzt tippen ohne gerechnet zu haben

wie das setup löst was du vor hast >> http://www.dkriesel.com/blog/2020/0106_ein_kleiner_technologiestack_fuer_datascience-heimprojekte

wenn noch ne warteschlange oder transaction log brauchst kannst du noch redis einbauen. hab nen stack mit scrapy, redis, airflow etc seit über nem jahr am laufen. ist robust, schreibt jeden tag it weltgeschichte.


BTW DENKE MAL BEIM FORTLAUFEN DER VOLLEN BEAMTENBEZÜGE, sau :fu:
 
Zuletzt bearbeitet:

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Hm also würde ich erst mal die ersten beiden Schritte machen
1. Rasberry Pi
2. SQLite drauf machen

Dann bestelle ich z.B. das hier als Starterpaket? ?
https://www.amazon.de/Raspberry-SD-...s=computers&sprefix=Ras,computers,154&sr=1-12

Dann bräuchte ich wohl nen Guide um den aufzusetzen?
https://kauri.io/install-raspbian-o...kubernetes/7df2a9f9cf5f4f6eb217aa7223c01594/a
Oder besser Tipps?

Und dann bräuchte ich ne Guide für SQLite draufzumachen? Empfehlungen? Hatte jetzt nichts gefunden.

Den Krisel Link kannte ich an sich schon und die Python Request Kacke, kann ich ja erstmal parallel auf meinem Desktop austesten.
 
Zuletzt bearbeitet:
Mitglied seit
21.09.2001
Beiträge
3.433
Reaktionen
1.999
Raspian als Distribution.
Der Pi kommt glaube ich vanilla mit Python 3.6 wenn psthon 3.x drauf >> pip install requests . sqlite ist ab python 3x schon dabei.

dann api endpoint per requests ansprechen >> wird dir wohl ein json liefern, das würde ich inem jupyter notebook mit pandas und ggf. numpy in die gewünschte form bringen gg no re
 
Zuletzt bearbeitet:

Das Schaf

Tippspielmeister WM 2018
Mitglied seit
27.06.2002
Beiträge
7.249
Reaktionen
11
Ort
Marktoberdorf
brauchst nicht zwingend SQLite,
wenn du dich damit wohl fühlst mach das damit.
MariaDB/MySql und Konsorten kannst du dir auch kostenlos installieren und nutzen.

Nur falls du das nicht aufm Schirm hast.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
OK behalte ich mal im Hinterkopf und wäre mir eigentlich egal, ich kann weder das eine noch das andere aktuell.

In der Zwischenzeit hab ich den Rasberry Pi gekauft und aufgesetzt und kann ihn auch ansteuern. Das heißt jetzt müsste ich wohl die Scripte erstellen, mit denen ich die Abfrage mache.

Jetzt hab ich drei Probleme :)
1. Die Anfrage erstellen
2. Die Abfrage speichern
3. Die Antwort parsen

An sich sollte das Parsen laut dem Kriesel Link ja erst am Ende komme und man speichert die Roh Antwort jeden Tag in einer SQLite DB

Vielleicht könntet ihr mir erst mal bei der Abfrage helfen. Es gibt ein Python SDK aber meine Anfrage ist da nicht drin, weil sie wohl nicht mit Hin und Rückflug direkt eingebaut haben. Daher muss ich wohl erst einen JSON String schreiben, denn ich dann über Tool abfragen kann. Meine Frage ist jetzt wie ich am besten die für mich relevanten Parameter: originLocationCode, destinationLocationCode, und date von einer andere Liste/dict ausgehend anpassen kann.

Mein Weg wäre jetzt der hier. Bin sehr offen für Tipps & Tricks. Speichere jetzt jede Antwort als einzelne File
https://github.com/Benrath/amadeus/blob/master/Find flights prices save responses.py

Dann bau ich jetzt eine File die die Antworten wieder einliest und dann parsed.
 
Zuletzt bearbeitet:

Das Schaf

Tippspielmeister WM 2018
Mitglied seit
27.06.2002
Beiträge
7.249
Reaktionen
11
Ort
Marktoberdorf
OK behalte ich mal im Hinterkopf und wäre mir eigentlich egal, ich kann weder das eine noch das andere aktuell.

In der Zwischenzeit hab ich den Rasberry Pi gekauft und aufgesetzt und kann ihn auch ansteuern. Das heißt jetzt müsste ich wohl die Scripte erstellen, mit denen ich die Abfrage mache.

Jetzt hab ich drei Probleme :)
1. Die Anfrage erstellen
2. Die Abfrage speichern
3. Die Antwort parsen

An sich sollte das Parsen laut dem Kriesel Link ja erst am Ende komme und man speichert die Roh Antwort jeden Tag in einer SQLite DB

Vielleicht könntet ihr mir erst mal bei der Abfrage helfen. Es gibt ein Python SDK aber meine Anfrage ist da nicht drin, weil sie wohl nicht mit Hin und Rückflug direkt eingebaut haben. Daher muss ich wohl erst einen JSON String schreiben, denn ich dann über Tool abfragen kann. Meine Frage ist jetzt wie ich am besten die für mich relevanten Parameter: originLocationCode, destinationLocationCode, und date von einer andere Liste/dict ausgehend anpassen kann.

Mein Weg wäre jetzt der hier. Bin sehr offen für Tipps & Tricks. Speichere jetzt jede Antwort als einzelne File
https://github.com/Benrath/amadeus/blob/master/Find flights prices save responses.py

Dann bau ich jetzt eine File die die Antworten wieder einliest und dann parsed.

Sorry
gerade wenig zeit mir das anzuschauen wenn das Forum mal geht.

Genau, du willst jede Antwort abspeichern. Diese Antworten dann bei Bedarf wieder laden und parsen.
Ob das jetzt als File gespeichert wird oder später in ner DB ist eigentlich nebensächlich, das Prinzip ist das gleiche.
Du Lädst dir die Antworten alle als db/files und parst die dann.

btw deine json anfrage ist ja immer nach dem Schema
{
origin: "variable1"
desti: "variable2"
}

das kannst du ja dementsprechend immer Anpassen.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Danke.

Ich schreib morgen mal was mehr. Bin inzwischen auch schon was weiter gekommen und freue mich auf input.
ich lad sonst einfach wieder paar Sachen auf Git hoch.

So ich hab mal mein github geupdatet und auch selber bei mir lokal gecloned. Hab ich noch nie richtig genutzt und scheint mit der Desktop App jetzt doch recht easy zu gehen. Hatte mich davor immer gedrückt.
https://github.com/Benrath/amadeus

Da liegt jetzt mein aktueller Stand.
10 Find Airport
Such ich alle IATA Codes für meine Bahnhöfe und speichere das.

20 Create Request OD List
Ich permutier die IATA Codes die ich hab miteinander und mach nen Dataframe draus in dem ich in einigen Spalten die Parameter für die JSON Abfrage speichere. Da muss ich mir noch überlegen was ich sonst noch an den Parametern spielen möchte oder sollte. Bisher hab ich 3 Arten von Trips, Kurz, Mittel und Lang geplant. Müsste bestimmt noch mehr Sachen permutieren oder einfügen. Business vs. Economy mit oder ohne Gepächt.
Je nachdem wie viele das sind, ziehe ich wohl nur zufällige welche daraus.
Ich reduziere am Anfang auf 6 ODs.

30 Request and save responses
Lädt dann die Liste der Request, erstellt den Json Befehl anhand der Platzhalter Spalten des data frames, fragt ab und speichert als ein pickle file (Danke @Reddy).

40 Parse responses
Liest dann als Beispiel eins der pickle files ein und parsed es dann mit json_normalize (Danke @Bootdiskette).
Hab mich jetzt auf 3-4 Sachen konzentriert die ich möchte und die ich dann in meine DB speichern könnte.
Da muss ich mir noch überlegen wie ich die DB designe

90 Create SQL DB
Erstelle ich ne DB mit sqlalchemy, aber da müsste ich wohl noch wesentlich mehr dran arbeiten. Oder ich design mir die Datenbank als 5-6 Tabellen in Enterprise Architect mit den FK Beziehungen..

Macht das bisher so Sinn?
Brauch ich die DB überhaupt?

Gibt bestimmt überall Verbesserungsmöglichkeiten..
Für mich ist das mit dem import package as ... sehr ungewohnt.
Macht es Sinn das einmal alles ins Master File zu schieben?

Wenn ich das irgendwann abgeschlossen habe, müsste ich noch lernen wie ich das Skript einmal am Tag oder so laufen lasse.
 
Zuletzt bearbeitet:

Das Schaf

Tippspielmeister WM 2018
Mitglied seit
27.06.2002
Beiträge
7.249
Reaktionen
11
Ort
Marktoberdorf
ich versuch mal auf paar punkte einzugehen. hab mir allerdings deinen Code nicht wirklich angeschaut. :ugly:

Brauch ich die DB überhaupt?
Was genau ist dein Ziel möchtest du abfragen speichern und in 2 monaten nochmal die vergangen verbindungen auswerten?
dann ja.
Möchtest du nur aktuelle Daten haben, dann nein

Gibt bestimmt überall Verbesserungsmöglichkeiten..
Für mich ist das mit dem import package as ... sehr ungewohnt.
so mal als lesbarkeittipp:
Code:
import pandas as pd
import numpy as np
du gewinnst nichts an lesbarkeit dadurch dass du panda als pd abkürzt.
pd.funktion1
oder
pandas.funktion1
was ist lesbarer?
Ist eine Stilfrage, der Code wird durch solche abkürzungen mMn eher unlesbarer. Wenn du in nem halben Jahr nochmal drauf schaust weißt du mit np oder pd nix anzufangen. Das ist ja nur eine vereinfachung zum tippen aber eine gute ide übernimmt das doch eh für dich.
Aber wie gesagt das ist eine Stilfrage ich krieg nur das kotzen bei so abkürzungen.
Macht es Sinn das einmal alles ins Master File zu schieben?

Objektorientierung ftw -> also meiner Meinung nach ist extrahieren in subklassen immer besser als alles in ein File/Klasse zu haben.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31

Danke, das klingt dann fast zu leicht
Müsste an sich nur etwas ähnliches wie das folgende schreiben
0 0 * * * python /home/pi/mein_script.py


@Schaf
Schade :)
Ich möchte jeden Tag die Requests machen und speichern und später das geparste speichern, weil ich für jeden Tag die Preise der FLüge von A nach B möchte, um dann im Verlauf des Jahres Durchschnitte etc. pro Strecke berechnen zu können.

Das mit dem Abkürzen ist mir schon klar, ich glaub pd und np vergesse ich dann nicht mehr. Es ist fast überall abgekürzt geschrieben, dass es andersrum imho anstrengender wäre.

Mit dem in die Masterfile schieben meinte ich nur die import sachen. Sonst versteh ich deinen letzten Satz nicht.


Ich hab jetzt irgendwie ein anders Verständnisproblem. Ich kann die reponses jetzt parsen und wollte gerne alles in einer DB speichern. Jetzt hab ich Problem wie ich die IDs in den Tabellen manage, weil ich erst eine Liste der Request erstelle würde und die in einer ersten Haupttabelle speichern würde. Die IDs würde die DB dann ja selber vergeben.

Wenn ich dann später parse, muss das alles zu der ersten gesetzten ID passen und die schreibe ich aktuell in den Dateinamen. Dann kann ich die Folgetabellen alle auf die Haupttabelle über diese ID verweisen lassen.

Ich könnte auch einfach nur irgendwie responses speichern und aus den Reponses den ursprünglichen Request auslesen. Aber son bisschen bleibt mein ID Problem dann, weil sich die anderen Tabellen auf die erste Response Table beziehen müsste und ich die ID erst kennen, wenn ich die einmal auf die DB und zurück geholt hätte.

Generell fehlt mir wohl die Erfahrung wie ich die DB und die Relations designe, dass ich die Daten effizient in die DB anhängen kann ohne jedes Mal alles einzulesen und ohne zu häufig Tabellen zwischen meinem Rechner und der DB hin und herzuschieben.
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
15.552
Reaktionen
76
Ort
Hamburg
Bietet sich kein natürlicher Schlüssel im Datensatz an?
Also die IATA Codes Start und Ziel pro Zeiteinheit (vermutlich Tag), oder habe ich dich falsch verstanden?
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Hm darüber hab ich noch nicht nachgedacht.

Ich hab meine Request Parameter in einem Objekt "response.request.params"

{'currencyCode': 'EUR',
'originDestinations': [{'id': '1',
'originLocationCode': 'HAM',
'destinationLocationCode': 'FRA',
'departureDateTimeRange': {'date': '2020-10-12', 'time': '00:00:00'}},
{'id': '2',
'originLocationCode': 'FRA',
'destinationLocationCode': 'HAM',
'departureDateTimeRange': {'date': '2020-10-21', 'time': '00:00:00'}}]

Aus dem bekomme ich wohl wieder ne Zeile mit Origin, Destination, Abflug, Rückflug, und paar anderen Sachen raus. Da könnte ich eventuell aus den Infos ne ID machen.

Die Daten der Antwort stehen in einem objekt response.data und da sind 5 Einträge pro Flugangebot drin.
Das steht alles mögliche, aber z.B. nicht HAM, FRA so eindeutig wie ich es gerne möchte.

{'type': 'flight-offer',
'id': '1',
'itineraries': [{'duration': 'PT1H10M',
'segments': [{'departure': {'iataCode': 'HAM',
'terminal': '2', 'id': '1',...},
{'duration': 'PT1H5M',
'segments': [{'departure': {'iataCode': 'FRA',
'terminal': '1','id': '3',...}],
'price': '122', ...
},
{'type': 'flight-offer',
'id': '1',...
}

Also das ist etwas verkürzt. Aber das ganze Ding ist leicht länger.

Aktuelle löse ich das in 4 Tabellen auf, die ich über Request_id und Offer_id mit meinen Request verbinden wollen würde.
 

Das Schaf

Tippspielmeister WM 2018
Mitglied seit
27.06.2002
Beiträge
7.249
Reaktionen
11
Ort
Marktoberdorf
Danke, das klingt dann fast zu leicht
Müsste an sich nur etwas ähnliches wie das folgende schreiben
richtig
Cronjobs sind unglaublich trivial aber unglaublich mächtig0

@Schaf
Schade :)
Ich möchte jeden Tag die Requests machen und speichern und später das geparste speichern, weil ich für jeden Tag die Preise der FLüge von A nach B möchte, um dann im Verlauf des Jahres Durchschnitte etc. pro Strecke berechnen zu können.

Das mit dem Abkürzen ist mir schon klar, ich glaub pd und np vergesse ich dann nicht mehr. Es ist fast überall abgekürzt geschrieben, dass es andersrum imho anstrengender wäre.

Mit dem in die Masterfile schieben meinte ich nur die import sachen. Sonst versteh ich deinen letzten Satz nicht.
Dann brauchst du die Datenbank auf jeden fall.

das import ding:
lass is in den einzelnen Files drin
theoretisch( bin kein python mensch) sollte das auch auch in deinem Master file gehen.
Aber für bessere Wartbarkeit mach das in unter keinen Umständen Zentral.
Importiere die Sachen die du in einem File brauchst auch nur in diesem File.
Stell dir alleine mal vor du schreibst teile deines Programms neu und vergisst einen Part. Es knallt ohne dass du richtig weißt wo.

PS Sorry:Ich bin durch meine Arbeit so ein Objektorientierungsnazi geworden.
ICh würde für alles Kl

Ich hab jetzt irgendwie ein anders Verständnisproblem. Ich kann die reponses jetzt parsen und wollte gerne alles in einer DB speichern. Jetzt hab ich Problem wie ich die IDs in den Tabellen manage, weil ich erst eine Liste der Request erstelle würde und die in einer ersten Haupttabelle speichern würde. Die IDs würde die DB dann ja selber vergeben.

Wenn ich dann später parse, muss das alles zu der ersten gesetzten ID passen und die schreibe ich aktuell in den Dateinamen. Dann kann ich die Folgetabellen alle auf die Haupttabelle über diese ID verweisen lassen.

Ich könnte auch einfach nur irgendwie responses speichern und aus den Reponses den ursprünglichen Request auslesen. Aber son bisschen bleibt mein ID Problem dann, weil sich die anderen Tabellen auf die erste Response Table beziehen müsste und ich die ID erst kennen, wenn ich die einmal auf die DB und zurück geholt hätte.
Prinzipiell holst du dir beim Lesen aus der Datenbank doch immer ein ResultSet
Das ist defacto eine Liste aller Ergebnisse deiner Abfrage
also
z.b.
ID START ZIEL PREIS DATUM

da kriegst du immer alles
Deinen Request kannst du doch auch in der db speichern.

Prinzipiell ist bei DB deiner Dimension eine extra ID spalte performance mäßig nie verkehrt. Die Datenmengen kriegst du so gar nicht hin wo das richtig auffällt. Und das handling bei Abfragen etc ist für ungeübte einfacher als Joins mit multiplen schlüsseln. ( jm2c)

Generell fehlt mir wohl die Erfahrung wie ich die DB und die Relations designe, dass ich die Daten effizient in die DB anhängen kann ohne jedes Mal alles einzulesen und ohne zu häufig Tabellen zwischen meinem Rechner und der DB hin und herzuschieben.

Ja aber das kommt mit der zeit
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
15.552
Reaktionen
76
Ort
Hamburg
Ich würde an deiner Stelle ohnehin request/response in jeweils einer Tabelle speichern und danach von den Daten mit SQL abstrahieren. Vorteil wäre, dass Du dich an Datenmodellen versuchen kannst, ohne immer gleich im Code zu bastlen. Funktioniert das nämlich sauber, bleibt dir der Kopf für eine Baustelle.

Du willst am Ende doch nur Informationen für eine Relation von Start - Ziel über den zeitlichen Verlauf haben.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Ich würde an deiner Stelle ohnehin request/response in jeweils einer Tabelle speichern und danach von den Daten mit SQL abstrahieren. Vorteil wäre, dass Du dich an Datenmodellen versuchen kannst, ohne immer gleich im Code zu bastlen. Funktioniert das nämlich sauber, bleibt dir der Kopf für eine Baustelle.

Du willst am Ende doch nur Informationen für eine Relation von Start - Ziel über den zeitlichen Verlauf haben.

Da verstehe ich nicht ganz was du mir sagen möchtest. und bei Schaf auch nicht ganz :)

Den Request permutiere ich ja über die n Flughäfen als Origin und Destination. Und setzt da noch Abflug und Rückflugdatum.
Das kann ich problemlos in einer (Haupt)-Tabelle speichern und dort wird dann ne ID in der DB vergeben. Das sind dann n Requests pro z.B. Tag.

Pro Request und Id in dieser Tabelle hab ich k offers. Und die müssten dann ja immer wieder auf diese Tabelle speichern.

Und dann hab ich teilweise noch g segmente etc pro offer.

kann immer die Id des Requests und der offers in die jeweilige Tabelle reinschreiben, damit die mit der Haupttabelle der Requests verbunden sind


Muss mir wohl einmal von der DB den Maxwert der ID Spalte der Request liste holen, dann die neuen Requests reinschreiben. Dann hol ich mir die Request wieder zurück aber nur wenn die ID über dem Max counter ist. Dann hab ich nur wieder die neuen, die ich abfrage möchte
 
Zuletzt bearbeitet:

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
15.552
Reaktionen
76
Ort
Hamburg
Okay, dann zerteilst Du ja schon alles, soweit so gut. Ich würde dir persönlich empfehlen dann das Ganze zu kapseln. Die Applikation erzeugt request/response und schreibt in die DB einfach als bulk insert ohne technische Schlüssel 1:1 die Inhalte in die Tabellen - im Prinzip eine reine staging Umgebung.

Den Rest würde ich immer relational erledigen, da hier die Stärken voll ausgespielt werden.
Also Normalisierung, schlüsseln und Erstellung deines Datenmodells mit Dimensionen und Fakten.

Versuche idealerweise keine unnötigen roundtrips von der Applikation zur DB. Das heißt bspw. Rückgabewerte von technischen Schlüsseln haben in der Applikation nichts verloren. Ich hoffe ich habe dich soweit richtig verstanden und mich auch einigermaßen verständlich ausgedrückt, damit zumindest mein Kernpunkt rüberkommt. Ich habe als ETLer aber auch einen fetisch für mehrstufige Ladeprozesse und Datenkapselung. Macht vor allem die Fehlersuche deutlich einfacher und bei Erweiterungen, kann man recht modular arbeiten.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Okay, dann zerteilst Du ja schon alles, soweit so gut. Ich würde dir persönlich empfehlen dann das Ganze zu kapseln. Die Applikation erzeugt request/response und schreibt in die DB einfach als bulk insert ohne technische Schlüssel 1:1 die Inhalte in die Tabellen - im Prinzip eine reine staging Umgebung.

Die raw response speichere ich zur Zeit als einzelne Datei (pickle Format) und gar nicht in der DB. Da wüsste ich auch gar nicht wie ich dieses super verschachtelte Ding, siehe oben, reinspeichern sollte.


Den Rest würde ich immer relational erledigen, da hier die Stärken voll ausgespielt werden.
Also Normalisierung, schlüsseln und Erstellung deines Datenmodells mit Dimensionen und Fakten.

Das versuche ich ja und fange mit der obersten Tabelle als die Requests an, dann die offers weil n pro request. etc.
Dann hängen die Folgetabellen über den FK in die oberen Tabellen. Andersrum bräuchte ich wohl Zwischentabellen? weil das keine 1 zu 1 Beziehungen sind


Versuche idealerweise keine unnötigen roundtrips von der Applikation zur DB. Das heißt bspw. Rückgabewerte von technischen Schlüsseln haben in der Applikation nichts verloren. Ich hoffe ich habe dich soweit richtig verstanden und mich auch einigermaßen verständlich ausgedrückt, damit zumindest mein Kernpunkt rüberkommt. Ich habe als ETLer aber auch einen fetisch für mehrstufige Ladeprozesse und Datenkapselung. Macht vor allem die Fehlersuche deutlich einfacher und bei Erweiterungen, kann man recht modular arbeiten.

Naja genau das würde ich jetzt zumindest einmal anfänglich tun. Weil ich doch irgendwie aus der DB wissen muss, wo die ID gerade steht. SElbst wenn ich die ID bei mir setze würde, müsste ich doch einmal wissen wo die ID gerade steht.


Danke auf jeden Fall für die Inputs, hilft mir viel

Also zumindest stand jetzt läut die Sache und ich kann wiederholend die Requests machen und er geht den den ID counter hoch. Muss halt einmal die Max ID einlesen und das speichern. und Schieb die Requests einmal zwischen DB und Python hin und her.
 
Zuletzt bearbeitet:

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
Nur so als Update. Bin doch eurem Rat gefolgt die Daten in die DB zu schieben ohne dass ich was hin und herschieben muss.
Nutze jetzt die IATA codes (FRA, DUS, etc) und das Datum des Hin und Rückflugs als IDs. Pro Offer hab ich schon ne ID im Request.

Das macht das ganze wohl robuster, weil ich jederzeit ohne Probleme aus den einzelnen Request files die DB wieder füllen kann.
Vorher hatte ich die Parameter der Requests irgendwie speichern müssen. Das wäre wohl eher doof gewesen.
 

parats'

Tippspielmeister 2012, Tippspielmeister 2019
Mitglied seit
21.05.2003
Beiträge
15.552
Reaktionen
76
Ort
Hamburg
Das passt doch und vor allem danke fürs aktuell halten. ;)
 
Mitglied seit
26.02.2005
Beiträge
10.330
Reaktionen
1.294
Website
www.www.www
Danke.
https://github.com/Benrath/amadeus

Macht es Sinn das einmal alles ins Master File zu schieben?

was zum fick bin ich lesend :ugly:? und zu deiner frage, ja es wuerde sinn machen das ganze von einer main.py oder so zu starten und die anderen dateien als module reinzuladen. dann laesst sich das ganze auch besser lesen. das ganze koennte in etwa so ausehen. falls du diesen weg gehst pack in den ordner eine leere datei __init__.py rein sonst spackt es rum mit den ganzen imports.

PHP:
import amadeus_api_utils as aau # modul welches sich um das api zeuchs kuemmert
import db_utils as db # modul welches sich um das db zeuchs kuemmert

def foo():
    '''
    wenn du willst kannst du auch hier noch funktionen haben
    '''

if __name__ == '__main__':
   data = aau.get_flights()
   db.save_flight_to_db(data)

da dein code nicht sehr gross ist kannst du alles in die main.py packen und die funktionen im if __name__ == '__main__': block ausfuehren, wurde dir all deine wiederholungen ersparen.

PHP:
import pandas as pd
import sqlite3 

def db_stuff(foo):
    '''
    store foo in db
    '''

def get_data_from_api():
    return '12-18 zwiebeln'
    

if __name__ == '__main__':
    db_stuff(get_data_from_api())
    print('done')

wenn du das ganze noch erweitern moechtest schau dir argparse an damit du das ganze mit argumente ueber das terminal steuern kannst.


edit:
bis du inder? :rofl2:

PHP:
import os
from os import path
from datetime import datetime
from datetime import timedelta

kann durch ersetzt werden

PHP:
import os
import sqlite3
from datetime import datetime, timedelta


sqlite3.Error
os.path()
 
Zuletzt bearbeitet:

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31
äh Danke für deinen hilfreichen Beitrag. Ich bin nicht Inder, sondern mache zum ersten mal was in Python. Finde das mit dem Import kack äußert nervig und hab da meinen Code auch noch nicht gesäubert, weil ich teilweise einzelnen Befehle von Bedarf zu Bedarf hinzugefügt habe.
 

Benrath

Community-Forum
Mitglied seit
19.05.2003
Beiträge
17.329
Reaktionen
31

Vielleicht erbarmt sich ja noch mal jemand. Paar andere Links haben mich verwirrte.

Mein Script liegt jetzt in "amadeus/test.py" und läuft auch wenn ich es aus dem Verzeichnis direkt mit "python3 test.py" starte.
Wenn ich es vom root dir mit "pyton3 amadeus/test.py" starte läufts schon wieder nicht. Ich vermute, weil dann der Working Pfad das Root Dir ist und nicht mehr /amadeus. Muss ich dann noch ein os.chdir() nutzen um den Pfad festzulegen?

Wie mache ich das jetzt genau im Cronjob, damit das mit dem Pfad funktioniert?
Sagen wir mal ich will das morgen um mitternacht laufen lassen.

0 0 13 10 * python3 amadeus/test.py

Hier stand was von wegen ich müsste schon für python3 mit Pfaden eingeben.
https://medium.com/@gavinwiener/how-to-schedule-a-python-script-cron-job-dea6cbf69f4e

Oder muss ich dann im Script noch mal ein os.ch

Ist für mich nicht so einfach, wenn ich keinen Output sehe, solange es nichts klappt und mir kein Fehler oder so angezeigt wird.

Hilft mir das hier noch?
https://stackoverflow.com/questions...n-python-scripts-and-what-form-should-it-take
Dann könnte ich es direkt ohne pytho3 zu callen starten?
 
Zuletzt bearbeitet:
Oben