Webauftritt mitPython&Datenbankfunktionalität

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Datenbanken besitzen einen eigenen Typ für Spalten, die ein Datum repräsentieren sollen. SQLite ist da zwar eine Ausnahme, weil es alles akzeptiert, trotzdem solltest du so arbeiten, dass du nicht darauf beschränkt bist.

Warum verwendest du eigentlich kein ORM wie SQLAlchemy um den Datenbankzugriff zu vereinfachen?

Edit: Ohjeh, ich sehe gerade: du hast im execute 2 Platzhalter und übergibst ganz viele Argumente. Das funktioniert natürlich nicht. Und Zeichenketten kann man höchstens mit + verbinden, sollte aber join verwenden. Einfach so Zeichen zwischen zwei Zeichenketten schreiben funktioniert nicht. So etwas kann man auch prima im interaktiven Interpreter ausprobieren.

Code: Alles auswählen

>>> gebtag = "01"
>>> gebmonat = "02"
>>> gebjahr = "2013"
>>> gebtag"-"gebmonat"-"gebjahr
SyntaxError: invalid syntax
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

Warum verwendest du eigentlich kein ORM wie SQLAlchemy um den Datenbankzugriff zu vereinfachen?
Darf ich nicht - Vorgaben aus der Uni :/

Oh, das mit den Platzhaltern hatte ich völlig übersehen, danke.
Wo gibt es denn den Interpreter?
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

sheep123 hat geschrieben:Wo gibt es denn den Interpreter?
Wenn das jetzt kein Scherz war, solltest du ddir die eit nehmen und das Tutorial und weiterführende Literatur zur Einführung in Python durchlesen. Das meine ich nicht böse.

Der Interpreter ist das, was deine Python-Scripte ausführt. Wenn du ihm keine Datei übergibst startet der interaktive Modus. Also ein einfaches python in der Kommandozeile oder dem Terminal.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Ich möchte damit bezwecken, dass Geburtsdaten in der Form DD-MM-YYY in der Datenbank gespeichert werden, da ich das dort so vorgegeben habe..
? - SQLite kennt keinen Datentyp für Zeit- und Datum. Aber diverse Funktionen, um den Text in eine Datum zurück zu konvertieren.
Allerdings weiß ich nicht, ob das überhaupt funktioniert, wenn ich im Formular Tag, Monat und Jahr getrennt abfrage?
Doch schon. Du musst dir halt selber ein datetime-Objekt aus den drei Einzelwerten bauen.

BTW: bei so vielen Formulardaten solltest du mittelfristig über den Einsatz eine Formvalidierungsframeworks wie WTForms nachdenken... Aber erst die anderen Probleme lösen ;-)

Gruß, noisefloor
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

Mittlerweile werden mir alle eingegebenen Daten richtig zurückgegeben - gespeichert werden sie allerdings nicht..
Das ganze scheint an dem Ausdruck hier zu scheitern.
Zuletzt geändert von sheep123 am Donnerstag 28. Februar 2013, 23:10, insgesamt 1-mal geändert.
BlackJack

@sheep123: Hast Du die Transaktion auch `commit()`\ted?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@sheep123: so wie Du execute aufrufst, wird sie nicht funktionieren, schau mal Deine Anführungszeichen an. Bitte Code auch so posten, wie Du in tatsächlich geschrieben hast.
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

Ja, commited habe ich sie auch.

Code: Alles auswählen

db.execute('INSERT INTO Benutzer(Benutzername,Passwort, Vorname, Nachname, Geschlecht, Geburtsdatum, eMail, Ortsname, Landname) VALUES (?,?,?,?,?,?,?,?,?)', (benutzername,passwort,vorname,nachname,geschlecht,gebtag,email,ort,land))
funktioniert auch nicht.
Ich habe das ganze jetzt mal auf

Code: Alles auswählen

db.execute('INSERT INTO Land(Landname) values(?)', (land))
heruntergebrochen und da bekomme ich dann die Fehlermeldung, dass es keine column land gäbe. Allerdings wird mir bei print land das eingegebene Land ausgegeben. Mit den Vorgaben in den Datenbanken stimmen die Eingaben auch überein, da dürfte es eigentlich auch zu keinem Fehler kommen.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sheep123 hat geschrieben:Ich habe das ganze jetzt mal auf

Code: Alles auswählen

db.execute('INSERT INTO Land(Landname) values(?)', (land))
heruntergebrochen und da bekomme ich dann die Fehlermeldung, dass es keine column land gäbe. Allerdings wird mir bei print land das eingegebene Land ausgegeben. Mit den Vorgaben in den Datenbanken stimmen die Eingaben auch überein, da dürfte es eigentlich auch zu keinem Fehler kommen.
Du müsstest einen anderen Fehler bekommen da du wieder vergessen hast den übergebenen Wert als Teil eines Tupels (also als (land, ))zu definieren.
BlackJack

@sheep123: Also so macht das echt keinen Sinn. Bitte poste den tatsächlichen Quelltext und die tatsächliche Fehlermeldung. Denn beim letzten Beispiel kann die Fehlermeldung nicht sein, dass es keine Spalte mit dem Namen `land` gibt, denn so eine Spalte kommt in dem SQL-Ausdruck überhaupt gar nicht vor. Andererseites funktioniert das `execute()` nicht, weil das zweite Argument eine Sequenz mit *einem* Element sein muss, und Du aber anscheinend eine Zeichenkette übergibst. Das würde nur mit `land` funktionieren wenn diese Zeichenkette nur *ein* Zeichen enthält.
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

Bei der Abfrage

Code: Alles auswählen

if db.execute('select max(FilmID) from Film'):
			c=db.execute('select max(FilmID) from Film')
			filmid=c.fetchone()
                        print filmid
			filmid=filmid+1
		else:
			filmid=1
bekomme ich im Moment die Ausgabe (6,). Wie mache ich es, dass nur die 6 dabei rauskommt, so dass

Code: Alles auswählen

filmid=filmid+1
funktioniert?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@sheep123: was soll die if-Abfrage bewirken?
Die Einrückungen sind falsch.
fetchone liefert ein Tuple zurück, mit allen Spalten, die Du abfragst.
Alles weitere steht in einem Anfänger-Tutorial.
BlackJack

@sheep123: Der Code sieht ausserdem nach einer potentiellen „race condition” aus. Was versuchst Du denn da? Etwa selber eine ID für einen Primärschlüssel zu vergeben? Das überlässt man der Datenbank. Das ist leider nicht einheitlich geregelt, aber jedes relationale DBMS das ich kenne hat einen Weg dafür, das man das nicht selber machen muss. Oft gibt es einen eigenen Datentyp. Bei SQLite3 wird automatisch ein Wert vergeben wenn eine Spalte den Typ und die Constraint ``INTEGER PRIMARY KEY`` hat und man beim Einfügen der Daten entweder keinen Wert für diese Spalte angibt, oder aber den Wert NULL.
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

ja, das habe ich damit eigentlich versucht, weil mir nicht klar war, wie das mit automatischen erhöhen funktionieren soll.
Ich habe das ganze bei Person z.B. so deklariert:

Code: Alles auswählen

Create table Personen(PersonenID int not null, Nachname varchar(50) not null, Vorname varchar(50) not null, primary key(PersonenID));
Würde sich die ID dort dann automatisch erhöhen, wenn ich keinen Wert für sie angebe?
Danke!
BlackJack

@sheep123: Nein, man muss das PRIMARY KEY direkt bei der Spalte deklarieren. Ich glaube Constraints die man am Ende angibt werden von SQLite komplett ignoriert. War jedenfalls das letzte mal als ich mir die Dokumentation dazu durchgelesen hatte so. Die werden allerdings im Schema gespeichert, können also immerhin noch als Absichtserklärung/Dokumentation dienen.

Die Tabelle würde ich übrigens in Einzahl benennen, also `Person` statt `Personen`. So eine Tabellendeklaration beschreibt ja welche Daten zu *einer* Person gespeichert werden müssen. Man kann sich das als Klasse vorstellen. Und die Tabellenzeilen sind dann die Exemplare von dieser Klasse. In einem ER- oder UML-Diagramm für einen Datenbankentwurf würde man die Entität ja auch `Person` nennen.
sheep123
User
Beiträge: 13
Registriert: Donnerstag 14. Februar 2013, 08:56

Zwei abschließende Fragen habe ich noch...

Hat jemand einen Tipp/Hinweis zum Ausgeben von Bildern, die in der DB gespeichert sind? Ich will die Bilder entsprechend auf der Website anzeigen. Wäre auch schon für hilfreiche Links dankbar!
Zuletzt geändert von sheep123 am Freitag 1. März 2013, 03:49, insgesamt 1-mal geändert.
BlackJack

@sheep123: Wo ist denn das Problem bei den Bildern? Du musst halt eine URL auf eine Funktion abbilden, die das entsprechende Bild aus der Datenbank liest, den entsprechenden Header der Antwort auf den MIME-Typ setzt, also Beispielsweise 'image/jpeg', damit der Browser weiss, was er da bekommt, und dann die Daten senden. Schau Dir einfach mal die Header an, die ein Webserver sendet wenn der Browser ein Bild übermittelt, beziehungsweise lies Dich ein bisschen in HTTP ein.

Wobei man Bilder eigentlich nicht in der DB speichert. In der DB wird üblicherweise nur gespeichert wo die Daten auf der Festplatte liegen, beziehungsweise die nötigen Informationen um eine URL zu erzeugen, die auf statische Dateien verweist.
Antworten