46

私は学んでい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:password@127.0.0.1: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()を別のモジュールに移動し、 main.pyuser.pyBaseで同じ変数を使用すると、テーブルが作成されます。

私の質問:「」とは何declarative_baseですか?

4

1 に答える 1

51

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

from user import User, Base

Basemain.pyに新しいクラスを作成する代わりに。

于 2013-03-02T15:25:58.253 に答える