Peewee und Bottle

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

Ich versuche mit Bottle direkt via Peewee auf die DB zuzugreifen:

Code: Alles auswählen

from bottle import Bottle
# from bottle_peewee import PeeweePlugin
from peewee import *
from peewee import Model, ForeignKeyField, CharField, TextField, IntegerField, BooleanField, DateTimeField, DateField, TimeField
import datetime

app = Bottle()
# db = PeeweePlugin('sqlite:///test.db')
db = SqliteDatabase('sqlite:///test.db')

class BaseModel(Model):
    class Meta:
        # database = db.proxy
        database = db

class Country(BaseModel):
	iso_code = CharField(max_length=3)
	name = CharField(max_length=100)

# Create an engine that stores data in the local directory's db file
app.install(db)

# db.database.create_tables([Country])
db.database.create_tables([Country])
Und erhalte diese Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "x.py", line 105, in <module>
    app.install(db)
  File "/home/nuc/Dropbox/x/venv/lib/python2.7/site-packages/bottle.py", line 715, in install
    raise TypeError("Plugins must be callable or implement .apply()")
TypeError: Plugins must be callable or implement .apply()
Gemäss: Link und Link

Es gibt auch ein Plugin, das ich aber eher ungern verwenden würde, da der Syntax etwas anders ist:
Link
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

In deinen Links wird nirgends `install` aufgerufen, wieso machst du es dann?
the more they change the more they stay the same
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Im Bottle-Peewee Usage wird es aufgerufen: Link

Edit:
Wenn ich das Statement heraus nehme erhalte ich:

Code: Alles auswählen

Traceback (most recent call last):
  File "x.py", line 108, in <module>
    db.database.create_tables([Country 
AttributeError: 'str' object has no attribute 'create_tables'
Zuletzt geändert von meego am Donnerstag 23. Juli 2015, 12:29, insgesamt 1-mal geändert.
lackschuh
User
Beiträge: 281
Registriert: Dienstag 8. Mai 2012, 13:40

http://bottlepy.org/docs/dev/plugindev.html#plugin-api

Entweder du verwendest bottle-peewee oder du schreibst dir dein "plugin" selber.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Gemäss der Peewee Doc sollte man es aber doch auch ohne Plugin verwenden können.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du verwendest das Beispiel aus der Plugin-doc, aber ohne Plugin, dann wunderst du dich warum es nicht funktioniert? Grund: du verwendest nicht das Plugin. Schau dir einfach *nur* die Dokumentation vom Peewee an, wenn du das Plugin *nicht* verwenden willst.
the more they change the more they stay the same
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Ich habe es, wie bereits erwähnt, auskommentiert:

Code: Alles auswählen

from bottle import Bottle
# from bottle_peewee import PeeweePlugin
from peewee import *
from peewee import Model, ForeignKeyField, CharField, TextField, IntegerField, BooleanField, DateTimeField, DateField, TimeField
import datetime

app = Bottle()
# db = PeeweePlugin('sqlite:///x.db')
db = SqliteDatabase('sqlite:///x.db')

class BaseModel(Model):
    class Meta:
        # database = db.proxy
        database = db

class Country(BaseModel):
	iso_code = CharField(max_length=3)
	name = CharField(max_length=100)

# Create an engine that stores data in the local directory's db file
#app.install(db)
db.connect()

# db.database.create_tables([Country])
db.create_tables([Country])
conn = sqlite3.connect(database, **kwargs)
peewee.OperationalError: unable to open database file
Benutzeravatar
noisefloor
User
Beiträge: 4181
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

in der Doku von PeeWee steht nichts davon, dass man den Datenbanknamen mit `sqlite:///` prefixen musst... Das ist aber bei SQLAlchemy so 8)

Vielleicht solltest du dich (endlich) mal für eine Marschrichtung für den Projekt entscheiden und nicht laufend die Module wechseln - könnte Verwirrungen wie diese vermeiden... ;-)

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

Hi

Okay. Das hat funktioniert. Komisch, dass das Peewee-Plugin diesen Prefix verwendet und Peewee nicht.

Was bringt das Plugin? Meine Gedanke ist: Wenn ich es ohne das Plugin verwende, habe ich keine Schwierigkeiten mit der Doku.

Übrigens, in deinem Todo-Tutorial scheint sich etwas auf eine frühere Version zu beziehen: ".. but the part surrounded by # is interpreted as a regular expression, which is the dynamic part of the route."

Greets
Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: es ist meistens sinnvoll, ein Plugin zu verwenden, wenn man die genaue Funktionsweise der einzelnen Module nicht kennt. Gerade Datenbanken reagieren auf verschiedene Threads/Prozesse mit ungewöhnlichem Verhalten, und wie und ob eine Framework Threads einsetzt ist ja von außen auch nicht ersichtlich. Ein Plugin hilft da, diese Abhängigkeiten sauber aufzulösen.
BlackJack

@meego: Das mit dem Präfix ist überhaupt nicht komisch. Woher sollte das Plugin denn sonst wissen was für ein DBMS verwendet wird?

Das Plugin bringt Dir das Du das nicht selbst programmieren musst. Sonst musst Du in jeder Funktion die auf die Datenbank zugreift selbst dafür sorgen das die Verbindung zur DB steht und nach der Aktion je nach Ausgang ein `commit()` oder ein `rollback()` durchführen.

Welche Schwierigkeiten mit der Dokumentation?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Hallo

Ach so. Ich schätze, dann mach es wohl Sinn das Plugin doch zu verwenden.

Es gibt ein paar Veränderungen zum Syntax der Doku.

database = db.proxy
statt
database = db

db.database.create_tables([Country])
statt
db.create_tables([Country])
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Muss ich das meinem .py file hinzufügen, damit Umlaute akzeptiert werden? Oder gibt es einen besseren Weg?:

Code: Alles auswählen

          #!/usr/bin/python
          # -*- coding: utf-8 -*-
          import os, sys
Benutzeravatar
noisefloor
User
Beiträge: 4181
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
meego hat geschrieben:Muss ich das meinem .py file hinzufügen, damit Umlaute akzeptiert werden?
Wo hinzufügen? In Quelltext oder in den zu speichernden Daten?
meego hat geschrieben: Oder gibt es einen besseren Weg?
Python 3 benutzen :-)

Gruß, noisefloor
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:


GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

noisefloor hat geschrieben:Hallo,
meego hat geschrieben:Muss ich das meinem .py file hinzufügen, damit Umlaute akzeptiert werden?
Wo hinzufügen? In Quelltext oder in den zu speichernden Daten?
Die Datenbank hat einen ASCII-Fehler gemeldet.
Benutzeravatar
noisefloor
User
Beiträge: 4181
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

dann poste doch mal den zugehörigen Code und die volle Fehlermeldung.

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

Hallo

Mit

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
geht's.

"SyntaxError: Non-ASCII character '\xc3' in file xpeewee.py on line 122, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details"

Ich habe Mühe über das Bottle-Peewee-Plugin testweise Daten abzurufen:

Code: Alles auswählen

app = Bottle()
db = PeeweePlugin('sqlite:///x.db')

@route('/test')
def test():
    for room in Roomtype.select():
        print room

app.install(db)

if __name__ == '__main__':
    run(host='localhost', port=8080, debug=True, reloader=True)
Benutzeravatar
noisefloor
User
Beiträge: 4181
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ich gehe mal davon aus, dass Zeile 122 im vollen Listing die mit dem `print` Statement ist? Das geht unter Python 2 davon aus, dass es nur ASCII-Zeichen bekommt, wenn man kein Encoding angibt. Details: siehe Link von jens.

Gibt es eigentlich einen bestimmten Grund, warum du kein Python 3 benutzt?

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

Hallo

Es wird ein Umlaut sein in meinem Dictionary sein.

Naja, es ist nicht Standard in Ubuntu. Man muss es explizit aufrufen.
Antworten