2016-07-05 4 views
0

私はデータベースに永続化するいくつかのクラスを作成しました。特定のフラグを使ってアプリケーションを実行して、すべてのクラスを取得して、対応するテーブルをデータベースに作成したいと考えています。そのために、クラスをインポートしてからBase.metadata.create_all(engine)メソッドを呼び出そうとしています。しかし、それは動作しません。同時に、実際のクラスのそれぞれをファイルから呼び出すと、テーブルが作成されます。SQLAlchemy、Declarative、PostgreSQL:テーブルを作成できません

これらのテーブルを作成するにはどうすればよいですか? 1つのファイル/スクリプトからそれらを作成するか、そのクラスをそれぞれのクラスに追加する必要がありますか?輸入品の奇妙な順序のための

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

def main(): 
    from sqlalchemy.ext.declarative import declarative_base 
    Base = declarative_base() 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    from Item import Item 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 

申し訳

1)Item.py

from sqlalchemy import Column, Integer, String, Float 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 

class Item(Base): 
    __tablename__ = "items" 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 

    def __repr__(self): 
     return "<~ {} ~> name: {}".format(self.id, self.name) 

2)main.pyが、私:ここ

は、私のコードの例です。あなたの授業や授業の読み込みの順序がどこかに読んでいたので、私はそれについて試してみました。あなたは既に Item.pyBaseを作成し

+0

私が見つけたことの一つは、 'import item'と' Item .__ base __。metadata.create_all(engine) 'のすべてが動作するということです。しかし、それは少し汚れたハックのように見えます。私はそれを作るたびにBaseが同じであると思った。 – Ibolit

答えて

3

、ちょうどmain.pyでそれをインポートします。

main.pyItem.pyが、その後main.pyで、同じフォルダにある場合:

from Item import Base, Item

そしてmain内のすべての輸入を削除関数なので、main.pyは次のようになります。

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 
from Item import Base, Item 

def main(): 
    engine = create_engine('postgresql+psycopg2://me:[email protected]/my_first_database', echo=True) 
    print(Item) 
    print(Item.__table__) 
    Base.metadata.create_all(engine) 

main() 
+0

そのようなDAOが多数ある場合はどうなりますか?私はBaseを別の場所に作成し、それをこれらのクラスのそれぞれにインポートしますか? – Ibolit

+0

なぜあなたは 'models.py'のように1つのファイルにグループ化し、同じファイルに' Base'を持っていませんか? –

+0

それは考えです。 Javaから来て、1つのファイルにいくつかの "パブリック"クラスを持つことは、最初に気になるものではありません:) – Ibolit

関連する問題