2012-12-23 190 views
14

我正在使用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

+1为有趣的标题 – Adam

回答

5

您的Post型号没有thread参考文献。添加一列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

这是一个One to Many关系,如SQLAlchemy关系配置文档中所述。

5

你应该在Post模型,上面写着添加一个字段:

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

SQLAlchemy的应该是怎样知道你是怎么定义这种关系应该将thhread链接到帖子?这就是为什么你应该有一个外键从一个帖子到它的线程。你可以允许它为空,如果它不属于一个线程,它取决于你的用例。

+0

很好的答案,但我要把它交给martijn <3 –

+0

@JakobBowyer不用担心! <3 :) – jadkik94

相关问题