Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите выражение 'primaryjoin' - PullRequest
0 голосов
/ 09 мая 2020

Пожалуйста, помогите мне с этой ошибкой? Я действительно изо всех сил пытался найти solid, простые примеры для SQLAlchemy. Хотя существует множество примеров моделей, но не так много примеров того, как использовать эти модели.

Ошибка:

sqlalchemy.exc.NoForeignKeysError: 
Could not determine join condition between parent/child tables on relationship Species.sc_genus
- 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, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relation

Base = declarative_base()


class Genus(Base):
    __tablename__ = 'genus'

    id = Column(Integer, primary_key=True)
    common_name = Column(String)
    scientific_name = Column(String)
    sc_sub_family = "sc_sub_family"

    def __repr__(self):
        return "<Genus(common_name='%s')>" % (self.scientific_name)


# Species is a child of Genus
class Species(Base):
    __tablename__ = 'species'

    id = Column(Integer, primary_key=True)
    common_name = Column(String)
    scientific_name = Column(String)
    sc_genus = relation("Genus", backref="species")

    def __repr__(self):
        return "<Species(common_name='%s')>" % (self.scientific_name)


def addSpecies(session):

    species = Species()
    species.common_name = "House Cat"
    species.scientific_name = "Felis catus"


    genus = Genus()
    genus.scientific_name = "Felis"
    session.add(genus)

    species.sc_genus = genus

    session.add(species)
    session.commit()


if __name__ == "__main__":
    from sqlalchemy import create_engine
    from sqlalchemy.orm import sessionmaker

    ## A bunch of stuff to make the connection to the database work.
    engine = create_engine('sqlite:///foos.db', echo=True)
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()

    addSpecies(session)

1 Ответ

0 голосов
/ 10 мая 2020

Мне нужно было указать внешний ключ для отношения.

class Genus(Base):
    __tablename__ = 'genus'

    id = Column(Integer, primary_key=True)
    scientific_name = Column(String)
    # sc_sub_family = "sc_sub_family"

    def __repr__(self):
        return "<Genus(common_name='%s')>" % (self.scientific_name)


# Species is a child of Genus
class Species(Base):
    __tablename__ = 'species'

    id = Column(Integer, primary_key=True)
    common_name = Column(String)
    scientific_name = Column(String)
    sc_genus = relation("Genus", backref="species")
    sc_genus_id = Column(Integer, ForeignKey('genus.id'))

    def __repr__(self):
        return "<Species(common_name='%s')>" % (self.scientific_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...