Sqlalchemy Ошибка отношения внешнего ключа при создании таблиц

Я создаю таблицы с использованием sqlalchemy, и некоторые из этих таблиц имеют более одного отношения внешнего ключа. Ниже приведен код. Я получаю ошибку:

sqlalchemy.exc.NoForeignKeysError: Невозможно найти какие-либо связи по внешнему ключу между "проектом" и "жанром"

при попытке запустить скрипт.

Может ли кто-нибудь объяснить мне, как таблицы создаются в sqlalchemy, порядок создания, если есть таблицы с более чем одним отношением.

   import sqlalchemy
   from  sqlalchemy.orm import *
   from sqlalchemy.ext.declarative import declarative_base
   import datetime
   from sqlalchemy import *


   engine =               sqlalchemy.create_engine('postgresql+psycopg2://postgres:newpassword@localhost:5432/test');


   Session = sessionmaker(bind=engine)


   session = Session()

   metadata = MetaData(engine)


   metadata.drop_all(engine)

   Base = declarative_base(metadata=metadata)

   class User(Base):
        __tablename__ = 'users'
        id = Column(Integer,primary_key = True)
        email = Column(String(30),nullable = False)
        password = Column(String(30),nullable = False)

   class Genre(Base):
        __tablename__ = 'genre'
        id = Column(Integer,primary_key = True)
        title = Column(String(30),nullable = False)

   class Status(Base):
        __tablename__ = 'status'
        id = Column(Integer,primary_key = True)
        status = Column(String(30),nullable = False)

   class FilmType(Base):
        __tablename__ = 'filmtype'
        id = Column(Integer,primary_key = True)
        filmtype = Column(String(30),nullable = False)

   class Project(Base):
        __tablename__ = 'project'
        id = Column(Integer,primary_key = True)
        name = Column(String(30),nullable = False)
        poster = Column(Text , nullable = False)
        genre_id = Column(Integer,ForeignKey('genre.id'))
        genre_id = relationship('Genre',backref = 'genres')
        owner = Column(Integer,ForeignKey('users.id'))
        owner = relationship('Users',backref = 'users')


   class Videos(Base):
         __tablename__ = 'videos'
         id = Column(Integer,primary_key = True)
         dropbox_url = Column(Text)
         film_type = Column(Integer,ForeignKey('filmtype.id'))
         film_type = relationship('FilmType',backref = 'film_types')
         video_status = Column(Integer,ForeignKey('status.id'))
         video_status = relationship('Status',backref = 'video_statuses')
         project_id = Column(Integer,ForeignKey('project.id'))
         project_id = relationship('Project',backref = 'projetcs')
         user_id = Column(Integer,ForeignKey('users.id'))
         user_id = relationship('User' , backref = 'video_owners')


  metadata.create_all(bind = engine)
  user_ = User(email='lala.com',password='lala')
  genre_ = Genre(title='Horror')
  status_ = Status(status='Active')
  filmtype_ = FilmType(filmtype ='lala')
  project_ = Project(name='lala',poster='mij.jpg')
  videos_ = Videos(dropbox_url='drop/vi.com')
  session.add(videos_)
  session.flush()
  session.commit()

ошибка

"sqlalchemy.exc.NoForeignKeysError: Не удалось определить условие соединения> между родительскими / дочерними таблицами для отношения Project.genre_id - внешние ссылки, связывающие эти таблицы, отсутствуют. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите" primaryjoin " "выражение".

2 ответа

Решение

Вы перезаписываете спецификацию столбца объектами отношений, поэтому SQLAlchemy никогда не видит столбцы. Посмотрите, не содержит ли ваша база данных столбцы внешнего ключа в таблицах, и переименуйте переменные класса столбца или класса отношений в уникальные имена. Может быть, что-то вроде этого:

owner_id = Column(Integer,ForeignKey('users.id'))
owner = relationship('Users',backref = 'users')

В моем случае я написал таблицу, но забыл столбец:

      owner_id = Column(Integer, ForeignKey('users'))

Вместо

      owner_id = Column(Integer, ForeignKey('users.id'))
Другие вопросы по тегам