模块化 peee

Mat*_*ock 4 python python-module 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()
Run Code Online (Sandbox Code Playgroud)

后来,我有了food.pyfood.db。但是假设TacoSpaghetti模型变得庞大且复杂,所以我想将它们分成不同的文件。具体来说,我想food在我的文件夹中创建一个PYTHONPATH具有典型层次结构的文件夹:

food/
    - __init__.py
    - BaseModel.py
    - Taco.py
    - Spaghetti.py
    - db/
        - food.db
Run Code Online (Sandbox Code Playgroud)

我想将模型放入各自的.py文件中,并有一个__init__.py如下所示的文件:

import peewee as pw

db = pw.SqliteDatabase('./db/food.db')

from . import BaseModel
from . import Taco
from . import Spaghetti

db.connect()
Run Code Online (Sandbox Code Playgroud)

但是,这显然不起作用,因为BaseModel.py无法访问db. 如果可以通过这种方式模块化多个 peewee 模型,那么正确的方法是什么?

Mat*_*ock 5

显然,诀窍是连接到BaseModel.py文件中的数据库。我将给出模块内容的完整概述。假设顶级文件夹已命名food并位于PYTHONPATH. 最后假设food.db存在food/db/food.db并且已被填充(例如,如问题中第一个代码块的底部)。

以下是模块文件:

__init__.py

from Taco import Taco
from Spaghetti import Spaghetti
Run Code Online (Sandbox Code Playgroud)

基础模型.py

import peewee as pw
db = pw.SqliteDatabase('/abs/path/to/food/db/food.db')

class BaseModel(pw.Model):
    class Meta:
        database = db
Run Code Online (Sandbox Code Playgroud)

玉米饼

import peewee as pw
from BaseModel import BaseModel

class Taco(BaseModel):
    has_cheese = pw.BooleanField()
Run Code Online (Sandbox Code Playgroud)

意大利面.py

import peewee as pw
from BaseModel import BaseModel

class Spaghetti(BaseModel):
    has_meatballs = pw.BooleanField()
Run Code Online (Sandbox Code Playgroud)

例如,现在您可以编写一个脚本(当然位于模块文件夹之外),例如:

主要.py

import food

for t in food.Taco.select():
    print "Taco", t.id, ("has" if t.has_cheese else "doesn't have"), "cheese"
Run Code Online (Sandbox Code Playgroud)

产生:

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
Run Code Online (Sandbox Code Playgroud)