2013-03-02 13 views
17

私はsqlalchemyを学んでいます。SQLAlchemy - 宣言的なもの

ファイル:user.py

from sqlalchemy import Column,Integer,Sequence, String 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
class User(Base): 
    __tablename__ = 'users' 
    id = Column(Integer,Sequence('user_seq'),primary_key=True) 
    username = Column(String(50),unique=True) 
    fullname = Column(String(150)) 
    password = Column(String(50)) 
    def __init__(self,name,fullname,password): 
    self.name = name 
    self.fullname = fullname 
    self.password = password 

ファイルmain.py今

from sqlalchemy.orm import sessionmaker 
from sqlalchemy import create_engine 
from user import User 
from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 
if __name__ == '__main__': 
    engine = create_engine('mysql://root:[email protected]:3306/test',echo=True) 
    Base.metadata.create_all(engine, checkfirst=True) 
    Session = sessionmaker(bind=engine) 
    session = Session() 
    ed_user = User('ed', 'Ed Jones', 'edspassword') 
    session.add(ed_user) 
    session.commit() 

私は実行main.py.ここに私の最初のコードでありますそれはテーブルを自動的に作成しません&私に 'session.commit()'の例外を与える。ここで、 'Base = declarative_base()'という行を別のモジュール&に移動すると、同じ 'Base'変数がmain.py & user.pyにあります。テーブルを作成します。

私の質問は 'declarative_base'とは何ですか?

+0

逆の場合に発生するエラーは何ですか? –

答えて

19

declarative_base()は、宣言的クラス定義(例ではBase変数に割り当てられています)の基本クラスを構築するファクトリ関数です。 user.pyで作成したものはUserモデルに関連付けられていますが、他の(main.pyでは)別のクラスであり、モデルについて何も知らないので、Base.metadata.create_all()呼び出しでテーブルが作成されませんでした。代わりにmain.py.に新しいBaseクラスを作成するuser.py

from user import User, Base 

からBaseをインポートする必要があります

+1

新しいファイルを作成して次の2行を追加します
行1:sqlalchemy.ext.declarative import宣言的ベース 行2:Base = declarative_base()
異なるファイルで複数のモデルクラスを作成しているので、この方法で作成しました。その背後には具体的な理由はありません。ただJavaでそのようにBeanを作成しました。ご回答ありがとうございます。 – Aniruddha

+0

@Aniruddhaチップをありがとう。また、これらの2行をモジュールの '__init __。py'ファイル&' mymodule import Base'から取り出します –