簡體   English   中英

模塊化的矮人

[英]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.pyfood.db 但是,可以說TacoSpaghetti模型正變得龐大而復雜,因此我想將它們拆分為不同的文件。 具體來說,我想在我的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM