2016-07-12 15 views
0

Ich versuche, eine Klasse für eine Datenbank mit peewee in Python zu erstellen. Dies führt zu verschachtelten Klassen aufgrund der Verwendung einer Klasse namens meta in den Modellen durch peewee. Meine Frage ist, wie definiere ich die Datenbank (= db) innerhalb der Klasse Meta? Gibt es vielleicht einen besseren Weg?Klasse in Klasse in Python, wie Informationen zu teilen

import peewee as pe 

    class DataBase(): 
     class SensorType(pe.Model): 
      name = pe.CharField(max_length=255, unique=True) 

      class Meta: 
       database = db 

    def ___init___(self,filename='sensors.db'): 
     db = pe.SqliteDatabase(filename) 
     db.connect() 
     db.create_tables([self.SensorType],safe=True) 

    def add_sensor(self,typeName): 
     type, created = self.SensorType.get_or_create(name=typeName) 
     return type, created 

    def get_sensors(self): 
     return self.SensorType.select().order_by(self.SensorType.name) 


if __name__ == '__main__': 

    myDb = DataBase() 
    myDb.add_sensor('Test') 

    for type in myDb.get_sensors():  
     print(type.name) 

Ich fand, dass die Klassen in der __init__ Funktion meiner Hauptklasse Werke definieren. Aber es ist wahrscheinlich nicht der bevorzugte Ansatz.

import peewee as pe 

class DataBase(): 
    def __init__(self,filename='sensors.db'):   
     db = pe.SqliteDatabase(filename) 
     db.connect() 

     class SensorType(pe.Model): 
      typename = pe.CharField(max_length=255, unique=True) 
      class Meta: 
       database = db    

     self.SensorType = SensorType   
     db.create_tables([self.SensorType],safe=True) 


    def add_sensor_type(self,typeName): 
     type, created = self.SensorType.get_or_create(typename=typeName) 
     return type, created 

    def get_sensor_types(self): 
     return self.SensorType.select() 

if __name__ == '__main__': 

    myDb = DataBase() 
    myDb.add_sensor_type('Test') 

    for type in myDb.get_sensor_types():  
     print(type.id, type.typename) 
+3

Ein besserer Weg? Ja, verwende keine verschachtelten Klassen. –

+1

Dem stimme ich zu, es scheint kein guter Ansatz zu sein. Hast du Hinweise, wie ich das in meinem Beispiel vermeiden kann? –

Antwort

2

Anstatt Klassen zu verschachteln, versuchen Sie die Vererbung. This post hat einige ziemlich anständige Informationen zur Verwendung von Vererbung und Metaklassen in Python.

Wenn Sie sich das Quickstart-Beispiel für peewee ansehen, funktioniert so etwas für Sie?

import peewee 

class BaseModel(peewee.Model):    
    def __init__(self, db): 
     super(BaseModel, self).__init__() 
     Meta.database = db 

    class Meta: 
     database = None 

class SensorType(BaseModel): 
    def __init__(self, db): 
     super(SensorType, self).__init__(db) 

    name = peewee.CharField(max_length=255, unique=True) 

class DataBase(): 
    def __init__(self, filename='sensors.db'): 
     self.db = peewee.SqliteDatabase(filename) 
     self.sensor_type = SensorType(self.db) 
     self.db.connect() 
     self.db.create_tables([self.sensor_type], safe=True) 

    def add_sensor(self, typeName): 
     type, created = self.sensor_type.get_or_create(name=typeName) 
     return type, created 

    def get_sensors(self): 
     return self.sensor_type.select().order_by(self.sensor_type.name) 

if __name__ == '__main__': 
    db = DataBase() 

    db.add_sensor('Test') 
    [print(type.name) for type in db.get_sensors()] 

Mess um mit dem __init__ Methode des Modells zu sehen, ob Sie eine Datenbankinstanz bei der Initialisierung passieren können.

Ich würde bleiben weit weg von der Definition einer Klasse innerhalb einer Methode.

Ich hoffe, das hilft!

+1

Vielen Dank, und der Link zum Beitrag auf Vererbung. Gutes Lesen. –

+0

Ich bekomme den folgenden Fehler, wenn ich diesen Code ausführe: 'NameError: Name 'Meta' ist nicht definiert '- es soll kein funktionierendes Beispiel sein? – RandomDude

0

Ich endete mit this approach von peewee Dokumentation. Es funktioniert und ich vermeide die verschachtelten Klassen:

import peewee as pe 
database = pe.SqliteDatabase(None) 

class BaseModel(pe.Model): 
    class Meta: 
     database = database 

class SensorType(BaseModel): 
    name = pe.CharField(max_length=255, unique=True) 

class DataBase(): 
    def __init__(self, filename='sensors.db'): 
     database.init(filename) 
     self.sensor_type = SensorType() 
     database.connect() 
     database.create_tables([self.sensor_type], safe=True)   

if __name__ == '__main__': 
    db = DataBase('test.db') 
+0

Ich war mir nicht sicher, wie du dich über eine globale Variable fühlst. Froh, dass Sie eine Lösung gefunden haben, die für Sie arbeitet! – pat