11

peewee を使用して多くのモデル クラスを定義しています。ClassName.create_table()テーブルを生成できますが、テーブルは 1 つだけです。単一のステートメントを使用してすべてのテーブルを作成するにはどうすればよいですか?

4

7 に答える 7

17

Peewee には正しい順序でテーブルを作成するヘルパーがありますが、すべてのモデルを明示的に渡す必要があります。

from peewee import *
db = SqliteDatabase(':memory:')
db.create_tables([ModelA, ModelB, ModelC])
于 2014-02-07T15:40:10.223 に答える
10

すべてのテーブルが1つのモジュールにグループ化されているという前提で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)
于 2014-02-07T16:13:05.293 に答える
2
for cls in globals().values():
    if type(cls) == peewee.BaseModel:
        try:
            cls.create_table()
        except peewee.OperationalError as e:
            print(e)
于 2016-03-27T12:09:42.507 に答える
2

このスニップネットは、現在のモジュールでオブジェクトが定義されているすべてのテーブルを作成します。

import sys

for cls in sys.modules[__name__].__dict__.values():
    try:
        if BaseModel in cls.__bases__:
            cls.create_table()
    except:
        pass
于 2014-06-30T06:34:55.093 に答える
0

既存の回答は、ドキュメントで推奨されている BaseModel パターンをサポートしていないことがわかりました。モデルを再帰的に見つけるためのヘルパー関数を作成しました

def all_subclasses(base: type) -> list[type]:
    return [
        cls
        for sub in base.__subclasses__()
        for cls in [sub] + all_subclasses(sub)
    ]

次に、アンダースコアを前に付けて、基本モデルを除外しました。

class _BaseModel(Model):
    class Meta:
        database = db

models = [
    sub for sub in all_subclasses(Model)
    if not sub.__name__.startswith('_')
]

db.create_tables(models)
于 2021-10-21T16:26:43.207 に答える