如何使用peewee创建模型中定义的所有表

时间:2014-02-07 15:16:50

标签: python orm peewee

我使用peewee定义了很多模型类。 ClassName.create_table()可以生成表,但只能生成一个表。如何使用单个语句创建所有表?

6 个答案:

答案 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()