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