2016-03-29 9 views
0

私たちは当初アプリケーションを構築していましたが、SQLAlchemy ORMを使用していましたが、時間が経つにつれて、複雑さとオーバーヘッドが益々不満を募らせており、クエリを実行可能にするために明示的にいくつかの初期のテストでは、コアがそれらのニーズに合っているように見えるので、スイッチを作ってみたいと思います。SQLAlchemy ORMからコアへの移行

私たちの現在のモデルのすべては、例えば、宣言を使用して定義されています。

class User(Base): 
    __tablename__ = 'users' 

    id = Column(Integer, primary_key=True) 
    name = Column(String(100), nullable=False) 
    autocomplete_crosses = relationship(u'Parent') 

class Parent(Base): 
    __tablename__ = 'parents' 
    id = Column(Integer, primary_key=True) 
    user = Column(ForeignKey('users.id'), nullable=False) 
    name = Column(String(100), nullable=False) 
    users = relationship(User') 

はさておき毎回__table__呼び出すする必要から、宣言でこれらを使用しての簡単な方法があります。

s = select([User.__table__.c.name, Parent.__table__.c.name])\ 
    .select_from(User.__table__.join(Parent.__table__)) 

は、私が直接私のテーブル名にアクセスし、ちょうどこのクリーナーを作るためにそれらを使用することができます。ここでは、私は現在、冗長で醜い感じている、やってんですよ?あなたはすべてのテーブルに対して自動的にそれを行うしたい場合は、すべてのクラスを定義した後

+1

さて、あなたが 'user = User .__ table__'をやめさせることは何もありません。 – univerio

+0

すべてのテーブルに対して自動的に行う方法はありますか? – Eli

答えて

0

、あなたはそれを反映することができます:それは非常に魔法のだから、私は実際にこれを行うことはお勧めしません

for cls in Base._decl_class_registry.values(): 
    if hasattr(cls, "__table__") and cls.__table__ is not None: 
     globals()[cls.__table__.name] = cls.__table__ 

。特に、それはglobals()を変更するので、それはlintersを壊すが、これはあなたがそれを行う方法である。