How to create all tables defined in models using peewee

前端 未结 6 1568
小鲜肉
小鲜肉 2021-02-20 08:07

I define a lot of model classes using peewee. ClassName.create_table() can generate the table,but only one table. How could I create all tables using a single state

相关标签:
6条回答
  • 2021-02-20 08:48

    This snipnet will create all tables which objects are defined in the current module:

    import sys
    
    for cls in sys.modules[__name__].__dict__.values():
        try:
            if BaseModel in cls.__bases__:
                cls.create_table()
        except:
            pass
    
    0 讨论(0)
  • 2021-02-20 08:52
    for cls in globals().values():
        if type(cls) == peewee.BaseModel:
            try:
                cls.create_table()
            except peewee.OperationalError as e:
                print(e)
    
    0 讨论(0)
  • 2021-02-20 08:54

    Extending coleifer's answer with the assumption that all tables are grouped in one module:

    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)
    
    0 讨论(0)
  • 2021-02-20 08:55

    Peewee has a helper that will create the tables in the correct order, but you still need to explicitly pass in all the models:

    from peewee import *
    db = SqliteDatabase(':memory:')
    db.create_tables([ModelA, ModelB, ModelC])
    
    0 讨论(0)
  • 2021-02-20 08:57

    An update for Python 3 (and everyone who comes across this question via Google like I did). If you have all models based on the main peewee Model class you can simply use:

    import peewee    
    models = peewee.Model.__subclasses__()
    

    Credit to this question for the idea. They also go into more detail on how to get it to work recursively if your model is more complex.

    0 讨论(0)
  • 2021-02-20 09:01
    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()
    

    This also works for ManyToManyField's get_through_model().

    0 讨论(0)
提交回复
热议问题