2016-07-12 25 views
0

我想創建一個類中使用Python peewee的數據庫。由於peewee在模型中使用了一個名爲meta的類,這導致了嵌套類。我的問題是,如何在類Meta中定義數據庫(= db)?有沒有更好的方法?類在Python中類類,如何共享信息

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) 

我發現在我的主類的__init__函數中定義類能夠工作。但它可能不是首選的方法。

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

更好的方法?是的,不要使用嵌套類。 –

+1

我同意,這似乎不是一個好方法。在我的例子中,你有沒有提示如何避免它? –

回答

2

代替嵌套類的,儘量繼承。 This post有一些關於如何在Python中使用繼承和元類的相當不錯的信息。在快速入門例子

尋找peewee,做這樣的事情對你的工作?

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()] 

惹模型的__init__方法四周,看看你是否能在初始化時傳遞一個數據庫實例。

我會留遠離定義一個方法中的一類。

我希望這有助於!

+1

謝謝你的幫助,並鏈接上的繼承職位。良好的閱讀。 –

+0

我得到以下錯誤,當我運行這段代碼:'NameError:名字「元」是不是defined' - 它不應該是一個工作的例子嗎? – RandomDude

0

我結束了使用this approach從peewee文檔。它的工作原理和我避免嵌套類:

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

我不確定你對全局變量的看法。很高興你找到了適合你的解決方案! – pat