myapp
__init__.py
scripts
__init__.py
initialize_db.py
models
__init__.py
meta.py
foo.py
moo.py
現在meta.py
可以包含一個共享Base
還有DBSession
:
Base = declarative_base()
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension))
每個foo.py
和moo.py
都可以將他們的共享基地從meta.py
。
from .meta import Base
class Foo(Base):
pass
要確保所有的表都回升,從models
子包內,爲了方便,你可以將它們導入models/__init__.py
:
from .meta import DBSession
from .foo import Foo
from .moo import Moo
沒有做這樣的事情不同的表將不會附加到Base
,因此在調用create_all
時不會創建。然後
你initialize_db
腳本可以通過
from myapp.models.meta import Base
Base.metadata.create_all(bind=engine)
您的意見創建的所有表都可以導入模型利潤:
from myapp.models import DBSession
from myapp.models import Foo
感謝您的回答!我很想知道爲什麼我們需要所有模型中的相同Base對象。我認爲Base會是一些靜態/共享對象,無論從哪裏調用,都可以獲取所有元數據。 – KaranK 2012-04-27 19:18:01
您不需要相同的基礎或元數據,但它肯定有助於保持清晰。每個數據庫引擎應該有一個描述該引擎模式的元數據對象。在python中,只有在導入模塊時纔會執行模塊,所以當您將models.py分解爲多個單獨的模塊時,它們將不會被拾取,直到每個模塊都被導入爲止。 – 2012-04-27 20:46:30