Как создать все таблицы, определенные в моделях с помощью peewee

Я определяю много классов моделей, используя peewee. ClassName.create_table() может генерировать таблицу, но только одну таблицу. Как я могу создать все таблицы с помощью одного оператора?

6 ответов


расширение ответа 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)

У Peewee есть помощник, который создаст таблицы в правильном порядке, но вам все равно нужно явно передать все модели:

from peewee import *
db = SqliteDatabase(':memory:')
db.create_tables([ModelA, ModelB, ModelC])

этот snipnet создаст все таблицы, объекты которых определены в текущем модуле:

import sys

for cls in sys.modules[__name__].__dict__.values():
    try:
        if BaseModel in cls.__bases__:
            cls.create_table()
    except:
        pass

обновление для Python 3 (и всех, кто сталкивается с этим вопросом через Google, как и я). Если у вас есть все модели, основанные на основном классе модели peewee, вы можете просто использовать:

import peewee    
models = peewee.Model.__subclasses__()

кредит этой вопрос по идее. Они также более подробно описывают, как заставить его работать рекурсивно, если ваша модель более сложна.


for cls in globals().values():
    if type(cls) == peewee.BaseModel:
        try:
            cls.create_table()
        except peewee.OperationalError as e:
            print(e)

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().