Python 模块化peewee

Python 模块化peewee,python,python-module,peewee,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 =

假设我在
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()
from BaseModel import BaseModel
db = pw.SqliteDatabase('./db/food.db')
bm = BaseModel(db)
我想将模型放入各自的
.py
文件中,并有一个
\uuuu init\uuuuu.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
。如果可以以这种方式对多个peewee模型进行模块化,那么正确的方法是什么?

您在路径中遇到了问题:

__location__ = os.path.realpath(os.path.join(os.getcwd(), os.path.dirname(__file__)))
db = pw.SqliteDatabase(os.path.join(__location__, 'db/food.db'));

还可以尝试实现类的
\uuuu init\uuu
,并将
db
作为参数传递给它:

class BaseModel(pw.Model):
    def __init__(self, db = None)
        self.database = db
而不是在
\uuuu init\uuuuuuuuuuy.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()
from BaseModel import BaseModel
db = pw.SqliteDatabase('./db/food.db')
bm = BaseModel(db)

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

以下是模块文件:

__初始值

BaseModel.py

玉米卷

意大利面


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

main.py

产生:

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

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


这不起作用。如果我对
Taco.py
执行相同的操作,当我尝试访问模式的属性时,它会显示
peewee.OperationalError:没有这样的表:Taco
。事实上,如果我的
\uuuu init\uuuu.py
只是:
导入peewee作为pw;db=pw.SqliteDatabase('./db/food.db');db.connect()
,我得到一个错误
peewee.OperationalError:无法打开数据库文件
请尝试使用同样不起作用的
db=pw.SqliteDatabase('food/db/food.db')
。如果我使用绝对路径,错误就会消失,但这没有什么区别,因为在我尝试访问模型属性时,我得到了
无此类表
错误。在将
db
传递到
Taco(db)
之前或之后,无论是否使用
db.connect()
语句,都会发生这种情况。即使问题仅仅在于路径,如果不将类用作类,也没有使用类的意义。检查我的更新以修复路径。我不知道你的意思。我把它们当作课堂使用。除非我遗漏了什么,否则这根本不起作用(不管路径是否固定)。你能解释一下你的解决方案是如何与
\uuuu init\uuuu.py
文件中的其他类文件联系在一起的吗?事实上,我是通过谷歌看到你的帖子的!不幸的是,我没有使用flask,所以您的方法不太有效(我的解决方案请参见我上面((或下面的??)的答案)。我正试图完成的事情就是将模型分解成单独的文件。您的方法似乎将所有模型保留在一个文件中,并且不清楚每个模型文件将如何共享数据库实例,也不清楚应该在何处实例化数据库实例来实现这一点。这就是我在上面解决的问题。不过,谢谢!我尝试过模块化,当我没有任何外键时,它可以工作,因为它抱怨循环导入。如果我有外键,我将如何进行模块化
import peewee as pw
from BaseModel import BaseModel

class Taco(BaseModel):
    has_cheese = pw.BooleanField()
import peewee as pw
from BaseModel import BaseModel

class Spaghetti(BaseModel):
    has_meatballs = pw.BooleanField()
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