Mapper не может найти внешние ключи на вторичной таблице (отношение «многие ко многим») - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь описать простое отношение «многие ко многим» с помощью flask-SQLAlchemy, однако, средство отображения, похоже, не находит внешние ключи в моей вторичной таблице, даже если они правильно определены.

Я использую последнюю версию os flask-SQLAlchemy (2.4) и SQLite. Я перепробовал много вариантов кода и до сих пор ничего. Дументация тоже не помогает = /

user_permit = db.table('userpermit',
    db.Column('permit_id', db.Integer, db.ForeignKey('permit.permit_id'), primary_key=True),
    db.Column('user_mail', db.String(128), db.ForeignKey('user.user_mail'), primary_key=True)
)

class User(db.Model):
    user_mail = db.Column(db.String(128), primary_key=True)

[...]
    permits = db.relationship('Permit', secondary=user_permit, backref='users_permitted')

class Permit(db.Model):
    permit_id = db.Column(db.Integer, primary_key=True)

Я всегда получаю одно и то же сообщение об ошибке: NoForeignKeysError: Не удалось определить условие соединения между родительскими / дочерними таблицами для отношения User.permits - нет внешних ключей, связывающих эти таблицы через вторичную таблицу ''. Убедитесь, что ссылающиеся столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите выражения «primaryjoin» и «primaryjoin».

Кажется, он не распознает мою вторичную таблицу, так как она говорит '' вместо 'userpermit'.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Извините, ребята.Слишком много времени, глядя на строки кода.Оказывается, я создавал экземпляр db.table («разрешение пользователя» ..... вместо db.Table (с большой буквы)

Спасибо.

0 голосов
/ 30 мая 2019

Это может быть потому, что вы определяете db.table, а не db.Table.В противном случае необходимо проверить еще несколько вещей:

  • Поскольку вы не указываете __tablename__ = для каждой таблицы, проверьте, что имена таблиц соответствуют вашим ожиданиям, например, permit & user.
  • Вы можете вручную указать условие соединения, используя параметр primaryjoin, равный relationship(), который позволяет предоставить SQL для определения объединения
...