2010-07-28 2 views
2

나는이 모듈을 하나의 파일에두고, 같은 클래스에있는 다른 파일에 아이템 클래스를 가지고있다. 새 채널을 정의 할 때 다른 모듈이나 파일에있는 경우 항목이 동일한 파일에 없기 때문에 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? 두 클래스가 같은 파일에 있으면 오류가 발생하지 않습니다.Python - SqlAlchemy. 다른 모듈이나 파일의 테이블을 연결하는 방법은 무엇입니까?

ChannelTest.py

from ItemTest import Item 

metadata = rdb.MetaData() 

channel_items = Table(
     "channel_items", 
     metadata, 
     Column("channel_id", Integer, 
      ForeignKey("channels.id")), 
     Column("item_id", Integer, 
      ForeignKey("items.id")) 
    ) 

class Channel(rdb.Model): 
    """ Set up channels table in the database """ 
    rdb.metadata(metadata) 
    rdb.tablename("channels") 

    id = Column("id", Integer, primary_key=True) 
    title = Column("title", String(100)) 

    items = relation("Item", 
       secondary=channel_items, backref="channels") 

Item.py 다른 파일 만

class Item(rdb.Model): 
    """ Set up items table in the database """ 
    rdb.metadata(metadata) 
    rdb.tablename("items") 

    id = Column("id", Integer, primary_key=True) 
    title = Column("title", String(100)) 
사전에

덕분에 같은 모듈에서!

+0

어떤 오류가 발생하고 있습니까? –

+0

re : "같은 모듈에있는 다른 파일": 파이썬 모듈이 파일이라고 생각했습니다 (http://docs.python.org/tutorial/modules.html 참조). '모듈'대신 '패키지'를 의미합니까? (다만 저를 당혹 게하는 저것으로 검사 ...) – ssc

답변

0

문자열 메서드가 작동해야하지만 그렇지 않으면 단순히 모듈을 가져 오는 옵션도 있습니다.

import item 
Channel.items = relation(item.Item, 
         secondary=item.channel_items, 
         backref='channels') 
+0

나는 이미 그것을 시도했다. 나는 무슨 일이 일어나고 있는지 모른다. "NoReferencedTableError : 외래 키를 생성 할 테이블 'items'을 찾을 수 없습니다." 적어도 다른 오류이므로 테이블 이름 때문에 클래스를 찾을 수 있습니다. 항목 (클래스 항목)입니다. 그래서 나는 뭔가를 놓친 것 같아 고마워! – bribon

+0

불행히도 저는 rdb에 익숙하지 않습니다. 나는 이것이 일반 SQLAlchemy 클래스에서 작동한다는 것을 알고있다. 다른 클래스를 찾을 수 있도록 가져 오기가 여전히 누락 되었습니까? 'ChannelTest.py'에서'Item.py' 가져 오기를 시도하십시오. 그 반대의 경우도 마찬가지입니다. 그냥 고칠 수 있습니다;) – Wolph

0

"NoReferencedTableError: Could not find table 'items' with which to generate a foreign key"

모든 테이블 정의가 메타 데이터 오브젝트를 공유해야합니다

그리고 당신은 여전히 ​​같은 클래스의 인스턴스를 후 재산 을 추가 할 수있는 것보다 루프를 가져가주는 경우

. 따라서 별도의 모듈에서 metadata = rdb.MetaData()을 수행 한 다음이 metadata 인스턴스를 모두 Table()에 사용해야합니다.

관련 문제