首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模块化peewee

模块化peewee
EN

Stack Overflow用户
提问于 2015-12-17 21:27:47
回答 3查看 1.7K关注 0票数 4

假设我有几个简单的模型居住在food.py

代码语言:javascript
复制
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模型变得越来越庞大和复杂,所以我想将它们分成不同的文件。具体来说,我想用典型的层次结构在我的food中创建一个PYTHONPATH文件夹:

代码语言:javascript
复制
food/
    - __init__.py
    - BaseModel.py
    - Taco.py
    - Spaghetti.py
    - db/
        - food.db

我想将模型放入各自的.py文件中,并有一个类似于以下内容的__init__.py文件:

代码语言:javascript
复制
import peewee as pw

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

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

db.connect()

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-12-18 01:57:42

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

以下是模块文件:

__init__.py

代码语言:javascript
复制
from Taco import Taco
from Spaghetti import Spaghetti

BaseModel.py

代码语言:javascript
复制
import peewee as pw
db = pw.SqliteDatabase('/abs/path/to/food/db/food.db')

class BaseModel(pw.Model):
    class Meta:
        database = db

Taco.py

代码语言:javascript
复制
import peewee as pw
from BaseModel import BaseModel

class Taco(BaseModel):
    has_cheese = pw.BooleanField()

Spaghetti.py

代码语言:javascript
复制
import peewee as pw
from BaseModel import BaseModel

class Spaghetti(BaseModel):
    has_meatballs = pw.BooleanField()

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

main.py

代码语言:javascript
复制
import food

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

生产:

代码语言:javascript
复制
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
票数 5
EN

Stack Overflow用户

发布于 2015-12-17 21:38:10

你在道路上遇到了一个问题:

代码语言:javascript
复制
__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作为参数传递给它:

代码语言:javascript
复制
class BaseModel(pw.Model):
    def __init__(self, db = None)
        self.database = db

比在__init__.py

代码语言:javascript
复制
from BaseModel import BaseModel
db = pw.SqliteDatabase('./db/food.db')
bm = BaseModel(db)
票数 0
EN

Stack Overflow用户

发布于 2015-12-18 16:33:01

有关使用peewee模块化烧瓶应用程序的说明,请参阅本文:

http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34344556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档