2012-12-23 13 views
14

Sto usando sqlalchemy per progettare un sito web in stile forum. Ho iniziato a buttare giù il disegno ma ogni volta che provo a testarlo con alcuni inserti, scarica un mattone;Qualcuno può dire che cosa non va nelle mie relazioni?

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. 

Qui sono i miei "modelli"

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 per il titolo divertente – Adam

risposta

5

Il modello Post non ha il riferimento thread. Aggiungere una colonna per Post riferimento alla Thread un post appartiene:

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')) 

Non possiamo usare il nome thread perché è quello che il rapporto Post.replies aggiungerà al recuperati Thread istanze.

Questa è una relazione One to Many come documentato nella documentazione di Configurazione relazioni SQLAlchemy.

5

si dovrebbe aggiungere un campo nel modello Post che recita:

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

Come si suppone SQLAlchemy di sapere come questo rapporto si definisce supposto per collegare un thhread ad un alberino? Ecco perché dovresti avere una chiave esterna da un post alla sua discussione. Puoi consentire che sia nullo, se non appartiene a un thread, dipende dal tuo caso d'uso.

+0

Ottima risposta, ma lo darò a martijn <3 –

+0

@JakobBowyer Nessun problema! <3 :) – jadkik94

Problemi correlati