[英]Modularizing peewee
假設我有幾個駐留在food.py
的簡單模型:
import peewee as pw
db = pw.SqliteDatabase('food.db')
class BaseModel(pw.Model):
class Meta:
database = db
class Taco(BaseModel):
has_cheese = pw.BooleanField()
class Spaghetti(BaseModel):
has_meatballs = pw.BooleanField()
db.connect()
# populate with some data if table doesn't exist
from random import random
if not Taco.table_exists():
db.create_table(Taco)
for _ in range(10):
Taco.create( has_cheese = (random() < 0.5) )
db.commit()
if not Spaghetti.table_exists():
db.create_table(Spaghetti)
for _ in range(10):
Spaghetti.create( has_meatballs = (random() < 0.5) )
db.commit()
之后,我有food.py
和food.db
但是,可以說Taco
和Spaghetti
模型正變得龐大而復雜,因此我想將它們拆分為不同的文件。 具體來說,我想在我的PYTHONPATH
使用典型的層次結構創建一個food
文件夾:
food/
- __init__.py
- BaseModel.py
- Taco.py
- Spaghetti.py
- db/
- food.db
我想將模型放入各自的.py
文件中,並擁有一個看起來像這樣的__init__.py
文件:
import peewee as pw
db = pw.SqliteDatabase('./db/food.db')
from . import BaseModel
from . import Taco
from . import Spaghetti
db.connect()
但是,這顯然不起作用,因為BaseModel.py
無法訪問db
。 如果可以這種方式模塊化多個皮尤模型,那么正確的方法是什么?
顯然,訣竅是連接到BaseModel.py
文件中的數據庫。 我將提供模塊內容的完整概述。 假設頂層文件夾名為food
並且位於PYTHONPATH
。 最后,假設food.db
存在於food/db/food.db
並已填充(例如,如問題中第一個代碼塊的底部所示)。
以下是模塊文件:
__init__.py
from Taco import Taco
from Spaghetti import Spaghetti
BaseModel.py
import peewee as pw
db = pw.SqliteDatabase('/abs/path/to/food/db/food.db')
class BaseModel(pw.Model):
class Meta:
database = db
Taco.py
import peewee as pw
from BaseModel import BaseModel
class Taco(BaseModel):
has_cheese = pw.BooleanField()
Spaghetti.py
import peewee as pw
from BaseModel import BaseModel
class Spaghetti(BaseModel):
has_meatballs = pw.BooleanField()
現在,例如,您可以編寫一個腳本(當然位於模塊文件夾的外部),例如:
main.py
import food
for t in food.Taco.select():
print "Taco", t.id, ("has" if t.has_cheese else "doesn't have"), "cheese"
生產:
Taco 1 has cheese
Taco 2 has cheese
Taco 3 has cheese
Taco 4 doesn't have cheese
Taco 5 doesn't have cheese
Taco 6 has cheese
Taco 7 has cheese
Taco 8 has cheese
Taco 9 doesn't have cheese
Taco 10 doesn't have cheese
您在路徑中有問題:
__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
db = pw.SqliteDatabase(os.path.join(__location__, 'db/food.db'));
還嘗試實現類的__init__
並將db
作為參數傳遞給它:
class BaseModel(pw.Model):
def __init__(self, db = None)
self.database = db
比__init__.py
:
from BaseModel import BaseModel
db = pw.SqliteDatabase('./db/food.db')
bm = BaseModel(db)
有關使用peewee模塊化flask應用程序的說明,請參見此帖子:
http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.