JSONB Feld über wtforms füllen

Django, Flask, Bottle, WSGI, CGI…
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Wie fülle ich ein postgres JSONB Feld über wtforms über ein Webformular mit Werten, wie:

Code: Alles auswählen

{"Mon": ["11:40", "14:30", "15:30", "18:30"], "Tue": ["10:00", "18:00", "15:30", "18:30"]}
oder

Code: Alles auswählen

[["Mon", "11:40", "14:30", "15:30", "18:30"], ["Tue", "10:00", "18:00", "15:30", "18:30"]]
Ich sehe gerade, dass es vielleicht etwas schwierig wird, daraus zu erruieren, ob ein bestimmtes Geschäft augenblicklich offen hat oder nicht, oder sehe ich das falsch?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

sind die Daten, die du in deinem Post zeigst so, wie sie validiert von wtforms raus gegeben werden?

Und ist dein aktuelles Problem, die Daten AUS wtforms zu bekommen oder IN PostgreSQL zu bekommen?

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Ich weiss nicht, wie ich überhaupt Formulardaten (HTML) über WTF-Forms erzeuge, die mir erst die Möglichkeit für die Liste oder das Dictionary einräumen (welches m.W. problemlos in einen JSONB-String umgewandelt werden kann).

Die zweite Frage ist, ob man über eine solche JSON-Repräsentation eine DB-Abfrage machen kann, ob das betreffende Geschäft gerade offen hat oder nicht.

Gruss
BlackJack

@meego: Wie soll denn die Benutzerschnittstelle aussehen? Wie soll der Benutzer diese Daten eingeben können?

Und ist die Struktur überhaupt ”fein” genug? Denn bei den Öffnungszeiten scheinen doch jeweils zwei Zeiten zusammen zu gehören und Zeiten bestehen aus Stunden und Minuten. Das eine ist in einer flachen Liste gespeichert und das andere zusammen in einer Zeichenkette. Selbst wenn man da keine Datenbank hat: ganz normal mit einer beliebigen Programmiersprache wird das schon umständlich bei dieser fehlenden Strukturierung der Daten abzufragen ob zu einem gegebenen Zeitpunkt geöffnet ist, selbst wenn man darauf baut das die Zeiten als Zeichenketten verglichen werden könnten.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Postgres erlaubt auch einige Operationen auf JSONB in Queries zu machen. Vielleicht ist es mit diesen Operationen möglich in einem Query zu prüfen ob ein Laden geöffnet hat oder nicht, wenn man die Daten passend strukturiert. Dies dürfte effizienter sein als es in der Anwendungsebene zu machen und würde komplexere Queries erlauben die auf offenen oder geschlossenen Läden operieren.

Wie so ein Query oder die Datenstruktur aussehen müsste oder ob dies überhaupt so geht ist mir nicht klar, es könnte sich aber lohnen sich dies mal genauer anzuschauen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich weiss nicht, wie ich überhaupt Formulardaten (HTML) über WTF-Forms erzeuge, die mir erst die Möglichkeit für die Liste oder das Dictionary einräumen
Kann da "jeder" Daten eingeben (jeder = jeder angemeldete Benutzer) oder ist einem kleinem Kreis eingewehiter Benutzer zugänglich?

Wenn ersteres der Fall ist würde ich das JSON gar nicht um Frontend umsetzten, weil man IMHO die Eingabe von JSON-Daten keinem "normalen" Nutzer zumuten sollte.

Wenn's rein um die Umsetzung der Öffnungszeiten geht würde ich das wahrscheinlich einfach über Dropdown-Felder umsetzen, ggf. dynamisch durch JS ein- / ausblendbar. Und das JSON dann darauf erst im Backend zusammen bauen.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Über Usersystem habe ich mir noch nicht den Kopf zerbrochen. Verändern soll's dann aber nur der Inhaber können.

Ich möchte die Zeiten erst mal bei der Erfassung des betreffenden Geschäftsobjekts eingeben können.

Ist klar, dass das über normale Formularinputs geschehen soll. Allerdings wird das Formular bei den anderen Feldern über WTforms erzeugt.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: Du solltest Dir aber zuerst Gedanken über ein sinnvolles Datenformat machen. Welche Abfragen soll es geben? Wie sollen die Daten verarbeitet werden? Am besten hältst Du die Eingabe unabhängig vom eigentlichen Format.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Verändern soll's dann aber nur der Inhaber können.
Also muss am Ende das Frontend doch "Feld-, Wald- und Wiesentauglich" sein.
sirius hat geschrieben:Du solltest Dir aber zuerst Gedanken über ein sinnvolles Datenformat machen.
Sehe ich auch so.

In dem Zuge möchte ich auch mal "polyglotte Persistenz" in den Raum werfen. Je nach dem, was du pro Objekt so speichern willst (oder musst), macht es nicht unbedingt Sinn, alle Daten "nur" in ein RDBMS zu packen. Ggf. macht hier ein Gespann aus z.B. PostgreSQL und CouchDB auch Sinn, weil flexibler.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@Sirius:

Siehst du die Öffnungszeiten rechts? Sowas: http://www.yelp.de/biz/tibits-winterthur

Es muss also neben der Anzeige auch noch anzeigen können, ob augenblicklich offen ist.

Und bitte jetzt nicht möglichst komplexe Lösungen in den Raum werfen. Das würde bedeuten, das Pferd am Schwanz aufzuzäumen. :mrgreen:
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: Du solltest eine möglichst einfache Lösung finden. Je nachdem, ob Du nach allen gerade geöffneten Geschäften filtern willst, sollte eine reine SQL-Abfrage möglich sein. Damit fällt die Kombination "JSON und einfach" schonmal raus.

Meiner Meinung nach wäre dann folgende (Hilfs-)Tabelle am einfachsten: Geschäfts_ID, Wochentag, von, bis
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@sirius: Das JSONB feld wurde mir auf Sqlalchemy eben nahe gelegt, um die Zusatztabelle zu vermeiden und da es viel schneller sei. :wink:

Für von bis gäbe es dann noch den Nachmittag.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: was ist schlimm an Zusatztabellen? Dafür sind Datenbanken doch da. Dass es schneller ist, kommt drauf an. Bei einer Zusatztabelle hat man auch keinen Zusatzaufwand für den Nachmittag.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Okay, ich werde mir mal ein Modell basteln. :wink:

Code: Alles auswählen

class BizOpeningHours(db.Model):
    __tablename__ = 'biz_opening_hours'
    id = db.Column(db.Integer, primary_key=True)
    biz_listing_id = db.Column(db.Integer, db.ForeignKey('biz_listing.id'))
    day = db.Column(db.Integer, nullable=False) # 1 Mo, 2 Tu, 3 We, 4 Th, 5 Fr, 6 Sa, 7 Su
    opening_morning = db.Column(db.DateTime)
    closing_morning = db.Column(db.DateTime)
    opening_afternoon = db.Column(db.DateTime)
    closing_afternoon = db.Column(db.DateTime)
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@meego: Was machst du mit Geschäften, die ganztägig geöffnet haben? Oder die Mittwoch Nachmittag geschlossen haben?
In specifications, Murphy's Law supersedes Ohm's.
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: ein DateTime-Feld für eine Uhrzeit ist etwas überdimensioniert. Ich frage mich auch immer, warum Datenbankarchitekten immer so kryptische Namen vergeben müssen 'biz_listing'?
Was ist aus Sicht der Datenbank der Unterschied zwischen Vormittag und Nachmittag, wenn ich wissen will, ob ein Laden gerade geöffnet hat?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

pillmuncher hat geschrieben:@meego: Was machst du mit Geschäften, die ganztägig geöffnet haben? Oder die Mittwoch Nachmittag geschlossen haben?
Ich dachte, die geben dann einfach am zeiten an (Beispiel: 9:30 - 18:30. Oder was meinst du?

@Sirius3: Wie würdest du es benennen? db.Time reicht wohl. Kein Unterschied für die Öffnungsabfrage, aber vielleicht für die Darstellung im Frontend?
BlackJack

@meego: Wenn die ganztägig geöffnet haben dann gibst Du also 18:30 für `closing_morning` an? Was wird in dem Fall dann bei `opening_afternoon` und `closing_afternoon` gespeichert und wie sieht die SQL-Anfrage aus ob ein Geschäft gerade offen hat oder die Abfrage der gerade offenen Geschäfte? Vergleich das mal mit einer Abfrage für den Fall das es pro ”Schicht” einen Dateneintrag gibt und nicht pro Geschäft einen mit zwei ”Schichten”.

Und was ist wenn es mehr als zwei ”Schichten” mit geschlossenen Zeiten dazwischen gibt? Wie bildest Du das ab?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

tricky wird es auch, wenn es saisonal bedingten Öffnungszeiten gibt (z.B. in Urlaubsgebieten). Wenn man das berücksichtigen muss, muss die Tabelle noch anders aussehen. Wenn man's nicht berücksichtigen muss - Glück gehabt :-)

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Blackjack möchte die Tabelle also wie folgt verkürzen:

Code: Alles auswählen

class BusinessOpeningHours(db.Model):
    __tablename__ = 'business_opening_hours'
    id = db.Column(db.Integer, primary_key=True)
    business_listing_id = db.Column(db.Integer, db.ForeignKey('biz_listing.id'))
    day = db.Column(db.Integer, nullable=False) # 1 Mo, 2 Tu, 3 We, 4 Th, 5 Fr, 6 Sa, 7 Su
    opening = db.Column(db.Time)
    closing = db.Column(db.Time)
Keine Ahnung allerdings, wie man sowas dann einfach im Frontend (wtforms) abbildet.

@Noisy: Wir wollen die Sache jetzt nicht verkomplizieren. :mrgreen: Die Chance, das der Inhaber seinen Eintrag auch updated ist ohnehin ziemlich gering.
Antworten