Vermeidung von globaler Variable bei Peewee Datenbankmodell

  • Hallo,

    wie kann ich bei peewee die globale Variable DB vermeiden.

    Zusätzlich hätte ich das DB Variabel gestaltet werden kann, Variabel im Sinne von:

    • Übergabe der Parameter (von anderem Skript wo datenbankmodell.py importiert wird) der Zugangsdaten und db Namen
    • Ebenso der Part peewee.PostgresqlDatabase variabel ist, und dies abhängig ist was man in der Konfigurationsdatei einstellt (sqllite, mysql, postgres)


    Grundsätzlich um das oben genannte zu erfüllen muss DB in eine eigene Funktion.

    DB wiederrum muss auch schon fertig erstellt sein bevor die Klassen verwendet werden


    In der Dokumentation wird mit einem globalen db gearbeitet:

    http://docs.peewee-orm.com/en/…art.html#model-definition

    http://docs.peewee-orm.com/en/…eewee/query_examples.html


    Klassen sind gekürzt...

  • Zusätzlich hätte ich das DB Variabel gestaltet werden kann, Variabel im Sinne von:

    Übergabe der Parameter (von anderem Skript wo datenbankmodell.py importiert wird) der Zugangsdaten und db Namen
    Ebenso der Part peewee.PostgresqlDatabase variabel ist, und dies abhängig ist was man in der Konfigurationsdatei einstellt (sqllite, mysql, postgres)

    Wie wär's mit

    Code
    1. DB = getattr(pewee,dbtype,"PostgresqlDatabase")(database=db, user=uid, password=pw, host=h, port=p)
  • Hallo,


    wie bootsmann schon sagt: `DB` steht auf oberster Modulebene und das ist gut so. Bzw. das macht man so, auch z.B. bei SQLAlchemy. Bei Django liegt die Konfiguration der DB auch in einer globalen Konfigurationsdatei. "Global verfügbar" impliziert ja nicht, dass man das doofe `global` benutzt.


    Quote

    Grundsätzlich um das oben genannte zu erfüllen muss DB in eine eigene Funktion.

    Nee - wieso? Ungetestet:


    config.py:

    Python
    1. DB_CONFIG = {
    2. engine: 'sqlite',
    3. database: 'tollesachen.db',
    4. user = 'spamegg',
    5. password = 'foobar'
    6. }


    datenbankmodell.py:

    Gruß, noisefloor

  • "Global verfügbar" impliziert ja nicht, dass man das doofe `global` benutzt.

    Ok, das war genau meine Denkweise...


    Habe jetzt, auch dank eurer Hilfe eine funktionierende Lösung.

    In der Dokumentation hier zu finden: http://docs.peewee-orm.com/en/…cally-defining-a-database


    Meine Skripte sehen so aus:

    Anhand der beiden Auszüge der Skripte hoffe ich auch, erkennt man was ich mit den Eingangsfragen versucht habe zu Fragen, da es nicht so klar rüber gekommen ist:

    Die anderen Fragen verstehe ich nicht.

  • Hallo,


    das hast grundsätzlich bei Python einen globalen Namensraum. Immer. Kannst du gar nicht vermeiden - willst du auch gar nicht ;-) Da liegen z.B. auch die Build-In Funktionen von Python.


    Was da drin ist, kann man sich mit der Build-In Funktion `globals()` anzeigen lassen. Und diesen Namensraum sinnvoll nutzen ist auch vollkommen ok.


    `global foo` in einer Funktionen "hebt" die Variable foo aus dem lokalen Namensraum der Funktion in den globalen - das ist das, was gemeinhin "pfui" ist, weil es in 99% der Fälle falsch = schlecht programmiert ist.


    Gruß, noisefloor