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