模块化peewee
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.py
和food.db
。但是假设 Taco
和 Spaghetti
模型变得越来越大和复杂,所以我想将它们分成不同的文件。具体来说,我想在我的 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
。如果可以以这种方式模块化多个 peewee 模型,那么正确的方法是什么?
你的路径有问题:
__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)
显然,诀窍是连接到 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
有关使用 peewee 模块化 Flask 应用程序的说明,请参阅此 post:
http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/
假设我有几个简单的模型驻留在 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.py
和food.db
。但是假设 Taco
和 Spaghetti
模型变得越来越大和复杂,所以我想将它们分成不同的文件。具体来说,我想在我的 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
。如果可以以这种方式模块化多个 peewee 模型,那么正确的方法是什么?
你的路径有问题:
__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)
显然,诀窍是连接到 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
有关使用 peewee 模块化 Flask 应用程序的说明,请参阅此 post:
http://charlesleifer.com/blog/structuring-flask-apps-a-how-to-for-those-coming-from-django/