2012-12-23 16 views
14

मैं एक मंच शैली वेबसाइट डिजाइन करने के लिए sqlalchemy का उपयोग कर। मैंने डिजाइन को खटखटाया लेकिन हर बार जब मैं इसे कुछ आवेषणों के साथ परीक्षण करने की कोशिश करता हूं, तो यह एक ईंट डंप करता है;क्या कोई बता सकता है कि मेरे रिश्तों के साथ क्या गलत है?

thread_id = Column(Integer, ForeignKey("thread.id"), nullable=True, default=None) 

कैसे SQLAlchemy माना जाता है पता है कि कैसे इस रिश्ते आप परिभाषित:

NoForeignKeysError: Could not determine join condition between parent/child 
tables on relationship Thread.replies - there are no foreign keys linking 
these tables. Ensure that referencing columns are associated with a 
ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. 

यहाँ मेरी "मॉडल"

from sqlalchemy import Integer, Column, String, create_engine, ForeignKey 
from sqlalchemy.orm import relationship, sessionmaker, backref 
from .database import Base # declarative base instance 

class User(Base): 
    __tablename__ = "user" 
    id = Column(Integer, primary_key=True) 
    username = Column(String, unique=True) 
    email = Column(String, unique=True) 
    threads = relationship("Thread", backref="user") 
    posts = relationship("Post", backref="user") 

class Post(Base): 
    __tablename__ = "post" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    body = Column(String) 
    author = Column(Integer, ForeignKey("user.id")) 


class Thread(Base): 
    __tablename__ = "thread" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    replies = relationship("Post", backref="thread") 
    author_id = Column(Integer, ForeignKey("user.id")) 
    board_id = Column(Integer, ForeignKey("board.id")) 

class Board(Base): 
    __tablename__ = "board" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    threads = relationship("Thread", backref="board") 
    category_id = Column(Integer, ForeignKey("category.id")) 

class Category(Base): 
    __tablename__ = "category" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    desc = Column(String) 
    threads = relationship("Board", backref="category") 


engine = create_engine('sqlite:///:memory:', echo=True) 
Base.metadata.create_all(engine) 
session_factory = sessionmaker(bind=engine) 
session = session_factory() 
+44

मनोरंजक शीर्षक – Adam

उत्तर

5

आपके Post मॉडल में thread संदर्भ नहीं है।

class Post(Base): 
    __tablename__ = "post" 
    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    body = Column(String) 
    author = Column(Integer, ForeignKey("user.id")) 
    thread_id = Column(Integer, ForeignKey('thread.id')) 

हम क्योंकि जो Post.replies संबंध लिया गया Thread उदाहरणों में जोड़ देगा कि नाम thread का उपयोग नहीं कर सकते हैं: PostThread एक पोस्ट को संदर्भित करने के लिए एक कॉलम जोड़ें के अंतर्गत आता है।

यह एक One to Many संबंध है जो एसक्यूएलकेमी रिलेशनशिप कॉन्फ़िगरेशन दस्तावेज़ में प्रलेखित है।

5

आप पोस्ट मॉडल है कि पढ़ता में एक क्षेत्र जोड़ना चाहिए रहे हैं एक थ्रेड को एक पोस्ट से जोड़ना चाहिए? यही कारण है कि आप एक पोस्ट से अपने धागे के लिए एक विदेशी कुंजी होना चाहिए। यदि आप धागे से संबंधित नहीं हैं, तो आप इसे शून्य होने की अनुमति दे सकते हैं, यह आपके उपयोग के मामले पर निर्भर करता है।

+0

ग्रेट उत्तर के लिए +1, लेकिन मैं इसे मार्टिजन को दूंगा <3 –

+0

@JakobBowyer कोई चिंता नहीं! <3 :) – jadkik94