Seite 2 von 2

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 20:15
von meego

Code: Alles auswählen

File "x.py", line 17, in my_function
    return Roomtype.get(Roomtype.id == 1).roomtype_de
NameError: global name 'Roomtype' is not defined

Code: Alles auswählen

from bottle import Bottle, route, get, post, request, run, template
from bottle_peewee import PeeweePlugin

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

@route('/my_function')
def my_function():
	return Roomtype.get(Roomtype.id == 1).roomtype_de

app.install(db)

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 20:26
von BlackJack
@meego: Natürlich bekommst Du diesen Fehler, das ist absolute Grundlage von Python das alle Namen irgendwo definiert sein müssen bevor man sie verwendet. Also braucht man mit Ausnahme der direkt in Python ”eingebauten” Namen entsprechenden Code der einen Namen bekannt macht. Wo ist denn das bei `Roomtype` in Deinem Code der Fall? Woher soll Python wissen was damit gemeint ist?

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 20:34
von meego
Hi Blackjack

Ich dachte halt das Plugin macht die DB-Tabellennamen irgendwo bekannt.
Die Doku ist leider sehr spärlich:
https://pypi.python.org/pypi/bottle-peewee

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 20:41
von BlackJack
@meego: Die Dokumentation ist deshalb spärlich weil das Plugin so gut wie nichts macht ausser dem Handling des Zyklus für einen einzelnen Request/Response, eben das man sich das nicht bei jedem mal selbst schreiben muss. Ansonsten ist das `database`-Attribut halt das Pewee-Datenbankobjekt. Das war's auch schon (fast). Alles andere steht in der Pewee-Dokumentation.

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 20:49
von noisefloor
Hallo,
meego hat geschrieben:Naja, es ist nicht Standard in Ubuntu. Man muss es explizit aufrufen.
Das ist ja mal ein denkbar schlapper Grund. Ob du `python` tipps oder `python3` spielt ja wohl mal keine Rolle. Und ab Ubuntu 15.10 wird wohl Python 3 das Default-Python unter Ubuntu :-) Aber egal, ist ein anderes Thema.

Gruß, noisefloor

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 21:29
von meego
Hi

Also ich habe jetzt so ziemlich alle Varianten durchspekuliert..

Code: Alles auswählen

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

global db

@route('/my_function')
def my_function():
	return db.database.Roomtype.get(Roomtype.id == 1).roomtype_de

app.install(db)
return db.database.Roomtype.get(Roomtype.id == 1).roomtype_de
AttributeError: 'SqliteDatabase' object has no attribute 'Roomtype'

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 22:29
von BlackJack
@meego: Wo hast *Du* denn die Klasse `Roomtype` definiert? Alternativ: Wo in der Dokumentation steht das Du die nicht definieren musst, sondern die auf irgendeine magische Weise irgendwo (ja wo denn?) existiert? Du scheinst hier das Code-Raten auf die Spitze zu treiben und Dir einfach mal so Magie zu wünschen und zu hoffen irgendeine zusammegwürfelte Variante von Code den Du gerne mit einer solchen Bedeutung hättest, würde schon funktionieren.

Re: Peewee und Bottle

Verfasst: Freitag 24. Juli 2015, 23:14
von meego
Hi

In einer anderen .py-Datei mit der ich die DB erzeuge, ich dachte das Plugin kann die Tabellennamen auslesen:

Code: Alles auswählen

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

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

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

class Roomtype(BaseModel):
	roomtype_de = CharField(max_length=80)
	roomtype_en = CharField(max_length=80)
	hint_de = CharField(max_length=250)
	hint_en = CharField(max_length=250)

app.install(db)           # unklar: befähigt was?

db.database.create_tables([Roomtype])

roomtypes = [
    {'roomtype_de': 'bla'},
    {'roomtype_de': 'bla'},
]

with db.database.atomic():
    Roomtype.insert_many(roomtypes).execute()
Ich muss also anders vorgehen?

Re: Peewee und Bottle

Verfasst: Sonntag 26. Juli 2015, 20:37
von Sirius3
@meego: wie sollte denn eine Klasse, die irgendwo definiert wird plötzlich im Datenbankobjekt verfügbar sein? Du solltest wirklich mal die Dokumentation lesen.

Re: Peewee und Bottle

Verfasst: Sonntag 26. Juli 2015, 21:27
von meego
@Sirius: Ich habe jetzt alles in eine Datei genommen. Wo aber das Objekt aus den Klassen erstellt wird, ist mir immer noch nicht ganz klar. Vielleicht mit
app.install(db) ?

Re: Peewee und Bottle

Verfasst: Montag 27. Juli 2015, 06:45
von noisefloor
Hallo,
meego hat geschrieben:Vielleicht mit app.install(db) ?
Nee, damit machst du das Plugin nur deiner Bottle-Applikation "bekannt".

Gruß, noisefloor

Re: Peewee und Bottle

Verfasst: Montag 27. Juli 2015, 09:48
von meego
Hallo

Okay. Und wo werden dann aus den Klassen jetzt Objekte erzeugt?

Re: Peewee und Bottle

Verfasst: Montag 27. Juli 2015, 10:14
von noisefloor
Hallo,

wenn die Doku dir das nicht verrät, den wirf' das Modul weg und nimm' ein anderes ;-)

Gruß, noisefloor