我使用peewee定义了很多模型类。 ClassName.create_table()
可以生成表,但只能生成一个表。如何使用单个语句创建所有表?
答案 0 :(得分:12)
Peewee有一个帮助器,它将以正确的顺序创建表,但您仍需要明确传入所有模型:
from peewee import *
db = SqliteDatabase(':memory:')
db.create_tables([ModelA, ModelB, ModelC])
答案 1 :(得分:9)
扩展coleifer的答案,假设所有表都分组在一个模块中:
import inspect
import peewee
import tables
models = [
obj for name, obj in inspect.getmembers(
tables, lambda obj: type(obj) == type and issubclass(obj, peewee.Model)
)
]
peewee.create_model_tables(models)
答案 2 :(得分:3)
Python 3的更新(以及像我一样通过Google遇到此问题的所有人)。如果您拥有基于主要peewee Model类的所有模型,您只需使用:
import peewee
models = peewee.Model.__subclasses__()
归功于this这个想法的问题。如果您的模型更复杂,他们还会详细介绍如何使其以递归方式工作。
答案 3 :(得分:2)
此片段将创建在当前模块中定义对象的所有表:
import sys
for cls in sys.modules[__name__].__dict__.values():
try:
if BaseModel in cls.__bases__:
cls.create_table()
except:
pass
答案 4 :(得分:1)
for cls in globals().values():
if type(cls) == peewee.BaseModel:
try:
cls.create_table()
except peewee.OperationalError as e:
print(e)
答案 5 :(得分:1)
def create_all_tables():
for cls in sys.modules[__name__].__dict__.values():
if hasattr(cls, '__bases__') and issubclass(cls, peewee.Model):
if cls is not BaseModel:
cls.create_table()
这也适用于ManyToManyField的get_through_model()
。