2011-07-15 10 views
2

ちょうど頭が上がって、私は一般的なプログラミングには慣れていないので、私は単純なものを見逃していると思います。私は公式tutorial hereに従うことを試みており、私はBuilding Relationshipsセクションにいる。 'addresses'テーブルがないと、最後のsession.commit()まで動作します。これは私のコードがすべきだと思うものです。公式のORMチュートリアルに続き、私はエラーに陥っています

  1. アドレスはテーブルを設定します。
  2. metadata.create_all(engine)は、現在のセッションでテーブルを作成します。
  3. いくつかのアドレスを含む新しいユーザー 'ジャック'を設定しました。
  4. 私は 'ジャック'を追加してコミットしようとします。

私が間違っていることがわかりません。何か助けていただければ幸いです。

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey, create_engine 
from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy.orm import sessionmaker, relationship, backref 

Base = declarative_base() 
metadata = MetaData() 
engine = create_engine('sqlite:///:memory:', echo=False) 

Session = sessionmaker(bind=engine) 
session = Session() 

users_table = Table('users', metadata, 
        Column('id', Integer, primary_key=True), 
        Column('name', String), 
        Column('fullname', String), 
        Column('password', String) 
        ) 



class User(Base): 
    __tablename__ = 'users' 

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

    def __init__(self, name, fullname, password): 
     self.name = name 
     self.fullname = fullname 
     self.password = password 

    def __repr__(self): 
     return "<User('%s', '%s', '%s')>" % (self.name, self.fullname, self.password) 



class Address(Base): 
    __tablename__ = 'addresses' 
    id = Column(Integer, primary_key=True) 
    email_address = Column(String, nullable=False) 
    user_id = Column(Integer, ForeignKey('users.id')) 

    user = relationship(User, backref=backref('addresses', order_by=id)) 

    def __init__(self, email_address): 
     self.email_address = email_address 

    def __repr__(self): 
     return "<Address('%s')>" % self.email_address 



metadata.create_all(engine) 

session.add_all([User('jim', 'Jim Gregson', 'secretword'), 
       User('john', 'John Smith', 'password'), 
       User('jane', 'Jane Doe', 'qweasdzxc'), 
       User('bob', 'Bob Johnson', '122765')]) 

session.commit() 

for instance in session.query(User).order_by(User.id): print instance 



jack = User('jack', 'Jack Bean', 'gjffdd') 
print "jack.addresses: ", jack.addresses 
jack.addresses = [Address(email_address='[email protected]'), Address(email_address='[email protected]')] 
print "jack.addresses: ", jack.addresses 
print "jack.addresses[1].user: ", jack.addresses[1].user 

session.add(jack) 
session.commit() 

Error below when 'session.commit()' is called; 
sqlalchemy.exc.OperationalError: (OperationalError) no such table: addresses u'INSERT INTO addresses (email_address, user_id) VALUES (?, ?)' ('[email protected]', 5) 
+0

エラーはトレースバックを見ることで修正されますので、投稿してください。 –

答えて

4

Baseオブジェクトは、それはあなたのエンティティが定義されているように多くのメタデータを追加することをそれ自身のメタデータインスタンスが含まれています。したがって、Userクラスが定義されると、Baseオブジェクトはこれを認識し、Userクラスのすべてのメタデータを自身のメタデータインスタンス(Base.metadata)に追加します。

スクリプトでは、独自のメタデータインスタンス(metadata = MetaData())を作成した後、空のメタデータを使用してテーブルを作成しました(metadata.create_all(engine))。

独自のメタデータを作成し、代わりにベース1を使用しないでください:

 
Base.metadata.create_all(engine) 

編集:

別のノート:あなたはおそらく、ユーザーテーブルの同じエラーを受けているだろうが、私の答えで「空の」メタデータと呼ばれるものにusersテーブルのメタデータを定義したようです。これを行う必要はありません。 (Userクラスを定義する)方法でUserテーブルを定義することは、 "users_table = Table(...)"と言ったときに行ったことをすべて実行するのに十分です。あなたは基本的に同じことを2つのやり方でやっています。実際には同じことをするだけです。

+0

助けてくれてありがとう、それは今働いている。私はそれが何か明白でなければならないことを知っていた。 – akaGrim

関連する問題