Webauftritt mitPython&Datenbankfunktionalität
Ja, commited habe ich sie auch.
funktioniert auch nicht.
Ich habe das ganze jetzt mal auf 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.
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))
Ich habe das ganze jetzt mal auf
Code: Alles auswählen
db.execute('INSERT INTO Land(Landname) values(?)', (land))
Du müsstest einen anderen Fehler bekommen da du wieder vergessen hast den übergebenen Wert als Teil eines Tupels (also als (land, ))zu definieren.sheep123 hat geschrieben:Ich habe das ganze jetzt mal aufheruntergebrochen 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.Code: Alles auswählen
db.execute('INSERT INTO Land(Landname) values(?)', (land))
@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.
Bei der Abfrage
bekomme ich im Moment die Ausgabe (6,). Wie mache ich es, dass nur die 6 dabei rauskommt, so dass funktioniert?
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
Code: Alles auswählen
filmid=filmid+1
@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.
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:
Würde sich die ID dort dann automatisch erhöhen, wenn ich keinen Wert für sie angebe?
Danke!
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));
Danke!
@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.
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.
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!
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.
@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.
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.