我想在獨立的模塊或類中實現我的數據庫實現。但我正在努力處理一些細節。一個簡單的例子:如何在單獨的模塊中管理peewee數據庫?
from peewee import *
db = SqliteDatabase(':memory:')
class BaseModel(Model):
class Meta:
database = db
class User(BaseModel):
name = CharField()
db.connect()
db.create_tables([User,])
db.commit()
@db.atomic()
def add_user(name):
User.create(name=name).save()
@db.atomic()
def get_user(name):
return User.get(User.name == name)
到目前爲止這工作正常。我可以在這裏實現我的數據庫接口並將其作爲模塊導入。
現在我希望能夠在運行時選擇數據庫文件。所以我需要一種方法來定義Model類,而不需要定義前面的SqliteDatabase('somefile')
。我試圖封裝在一個新的數據庫類,以後我可以從導入和創建一個實例的一切:
from peewee import *
class Database:
def __init__(self, dbfile):
self.db = SqliteDatabase(dbfile)
class BaseModel(Model):
class Meta:
database = self.db
class User(BaseModel):
name = CharField()
self.User = User
self.db.connect()
self.db.create_tables([User,])
self.db.commit()
@self.db.atomic() # Error as self is not known on this level
def add_user(self, name):
self.User.create(name=name).save()
@self.db.atomic() # Error as self is not known on this level
def get_user(self, name):
return self.User.get(self.User.name == name)
現在我可以打電話例如database = Database('database.db')
或選擇其他任何文件名。我甚至可以在同一個程序中使用多個數據庫實例,每個實例都有自己的文件。
但是,有兩個問題的方法:
- 我還需要定義模型類之前指定的數據庫驅動程序(
SqliteDatabase
)。爲了解決這個問題,我定義了__init__()
方法中的Model類,然後用self.User = User
創建一個別名。我不太喜歡這種方法(它只是不覺得整潔的代碼),但至少它是有效的。 - 我不能使用
@db.atomic()
修飾器,因爲self
在課堂級別是未知的,所以我會在這裏創建一個實例。
所以這個類的方法似乎不工作得很好。有沒有更好的方法來定義模型類,而不必先選擇要存儲數據庫的位置?
哇,這實際上是記錄,爲什麼我錯過了?如果數據庫驅動程序不變,該文檔還建議使用'[db.init()](http://docs.peewee-orm.com/en/latest/peewee/database.html#deferring-initialization)'。 – Feodoran
@Feodoran謝謝你的補充。更新了答案。 – tarashypka