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