Seite 1 von 2
Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 09:54
von meego
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
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 11:11
von Dav1d
In deinen Links wird nirgends `install` aufgerufen, wieso machst du es dann?
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 12:14
von meego
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'
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 12:28
von lackschuh
http://bottlepy.org/docs/dev/plugindev.html#plugin-api
Entweder du verwendest bottle-peewee oder du schreibst dir dein "plugin" selber.
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 12:31
von meego
Gemäss der Peewee Doc sollte man es aber doch auch ohne Plugin verwenden können.
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 16:32
von Dav1d
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.
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 18:09
von meego
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
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 19:27
von noisefloor
Hallo,
in der
Doku von PeeWee steht nichts davon, dass man den Datenbanknamen mit `sqlite:///` prefixen musst... Das ist aber bei SQLAlchemy so
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
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 20:35
von meego
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
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 20:59
von Sirius3
@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.
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 21:01
von 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?
Re: Peewee und Bottle
Verfasst: Donnerstag 23. Juli 2015, 21:28
von meego
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])
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 12:32
von meego
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
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 14:04
von noisefloor
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
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 14:05
von jens
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 14:29
von meego
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.
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 17:16
von noisefloor
Hallo,
dann poste doch mal den zugehörigen Code und die volle Fehlermeldung.
Gruß, noisefloor
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 19:35
von meego
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)
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 19:54
von noisefloor
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
Re: Peewee und Bottle
Verfasst: Freitag 24. Juli 2015, 20:00
von meego
Hallo
Es wird ein Umlaut sein in meinem Dictionary sein.
Naja, es ist nicht Standard in Ubuntu. Man muss es explizit aufrufen.