Frage zu Datenbanken und Bottle

Django, Flask, Bottle, WSGI, CGI…
Antworten
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Hallo ihr,

Ich hab generell einige verständnisfragen zu bottle und Datenbanken.

Bislang habe ich meine eigenen DB erstellt und eingebunden
1.)

Code: Alles auswählen

install(SQLitePlugin(dbfile="name.db"))
und einfach in den routen per

Code: Alles auswählen

sql=db.execute("SELECT DISTINCT bla... DESC")
daten extrahiert... nun hab wird es im bottle tut so gemacht
2.)

Code: Alles auswählen

app = bottle.Bottle()
plugin = bottle.ext.sqlite.Plugin(dbfile='/tmp/test.db')
app.install(plugin)
und zugegriffen wird per

Code: Alles auswählen

@app.route('/show/:item')
def show(item, db):
    row = db.execute('SELECT * from items where name=?', item).fetchone()
    if row:
        return template('showitem', page=row)
    return HTTPError(404, "Page not found")


weiter gibts auch diese möglichkeit ohne eine "DB-file ein zu binden"
3.)

Code: Alles auswählen

conn = sqlite3.connect('name.db')
wo liegt denn da der unterschied und was ist besser? oder schneller? oder einfach warum?
ich weiß bei meiner (1) möglichkeit kann ich ohne connect immer auf eine DB zugreifen...von jeder Route aus.

Wie siehts aus wenn ich nun mehrere Datenbanken einbinden möchte? geht das mit allen dreien möglichkeiten? oder nur mit der dritten in der ich expliziet sage connecte zu name1.db oder name2.db ? oder ist das zu umständlich?

wäre über etwas aufklärung dankbar! :mrgreen:

grüße

...
BlackJack

@DanJJo: 1) und 2) sind identisch was die Datenbank angeht, d.h. welches davon Du verwendest hängt nicht von der Datenbank ab, sondern ob Du zum Beispiel mehr als eine App im gleichen Programm haben willst und deswegen nicht mit der einen Default-App auskommst.

Bei 3) kannst Du Dir die Nachteile doch ziemlich schnell selbst überlegen: Du müsstest in jeder Funkion, welche einer Route zugeordnet ist und auf die Datenbank zugreifen will, selbst eine Verbindung aufbauen und das ganze in eine ordentliche Fehlerbehandlung verpacken, mit `commit()`-Aufruf wenn alles glatt ging, und `rollback()`-Aufruf wenn es ein Problem gab und entsprechender Fehlerrückmeldung an den Browser. Damit man diesen Code nicht in viele Funktionen schreiben muss, sondern nur *einmal*, würde man sich mindestens einen Decorator dafür schreiben, wenn nicht gleich ein Bottle-Plugin. Also kann man auch das schon vorhandene Plugin verwenden.

Mehr als eine Datenbank sollte man ansprechen können, wenn man mehr als ein Exemplar von diesem Plugin installiert. Probiert habe ich es allerdings selbst noch nicht.

Edit: Wie man mehrere Datenbanken anspricht steht sogar mit Beispiel in der Dokumentation des SQlite-Plugins!
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

ok danke.


jetzt ist mir aber etwas aufgefallen...

wenn ich etwas in die DB speichere tu ich es auf diesem wege

Code: Alles auswählen

sql=db.execute('INSERT INTO Bla(wert1,wert2,wert3) values (?,?,?)',(var1.decode('utf-8'),var2.decode('utf-8'),var3.decode('utf-8'),))
"Ü","Ä","Ö" funktionieren auch einwandfrei...alle Sonderzeichen funktionieren bis auf " & " Wenn ich in var1 or var2 or var3 den "text1 & text2" abspeichern wird nur "text1" abgespeichert....gibts dafür eine erklärung ? :K
Sirius3
User
Beiträge: 18330
Registriert: Sonntag 21. Oktober 2012, 17:20

@DanJJo: Beim & wirst Du irgendwo die Parameter des Querystrings falsch verarbeiten, da & dort das Trennzeichen ist.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

Sirius3 hat geschrieben:@DanJJo: Beim & wirst Du irgendwo die Parameter des Querystrings falsch verarbeiten, da & dort das Trennzeichen ist.
wie soll ich das denn verstehen ? ich verarbeite keine & :mrgreen:

in einem *.tpl hab ich z.b folgendes

ajax:
...

Code: Alles auswählen

data: "&var1=" + $("#var1").val()
...

und

Code: Alles auswählen

<input id="var1" name="var1" required="required" type="text" maxlength="105" placeholder="blabla..." />
geh ich da irgendwoe falsch auf & ein ?
BlackJack

@DanJJo: Ja, Du gehst da nämlich gar nicht drauf ein. Das darf in `data` beim Ajax-Aufruf nicht *innerhalb* der Daten auftreten, weil es ja schon dazu dient die einzelnen Variablen zu trennen. Einen Query-String solltest Du nicht per Hand zusammen setzen, sondern die enstprechende jQuery-Funktion dafür verwenden:

Code: Alles auswählen

> $.param({'data': 'Smith & Wesson'})
"data=Smith+%26+Wesson"
Edit: Letztendlich musst Du das aber auch gar nicht selber machen, denn jQuery's Ajax-Methode nimmt an der Stelle für `data` auch ein Datenobjekt und serialisiert das für Dich.

Edit2: Es sieht ja so aus, als wenn Du nicht nur den Query-String selbst zusammenbaust, sondern auch die Low-Level `$.ajax()`-Funktion verwendest, statt `$.get()`. Und falls Du ein ganzes <form> verarbeiten möchtest, gibt es da ja auch Unterstützung um das komplett als Objekt abzufragen in einer Form die als `data` übergeben werden kann.
DanJJo
User
Beiträge: 90
Registriert: Mittwoch 13. Februar 2013, 18:35

nu hab ichs verstanden.

hole mir die daten jetzt per

Code: Alles auswählen

 data: $("#formID").serialize(), 
und mein "&" funktioniert :mrgreen:
Antworten