2016-07-12 9 views
0

私はpyeweeでpeeweeを使用してデータベースのクラスを作成しようとしています。これは、モデル内で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:name 'Meta'が定義されていません。 - 実際の例ではないと思われますか? – RandomDude

0

私はピーエーの文書からthis approachを使用して終了しました。それは動作し、ネストされたクラスは避けます:

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

関連する問題