SQLAlchemy: не удалось определить условие соединения между родительскими / дочерними таблицами при взаимосвязи

#python #database #sqlite #sqlalchemy

#python #База данных #sqlite #sqlalchemy

Вопрос:

Итак, у меня есть эти два простых класса внутри одного и того же файла python, который я пытаюсь сопоставить с помощью SQLAlchemy, где пользовательский столбец ‘password_id’ также является внешним ключом к столбцу пароля таблицы ‘password_id’

 from sqlalchemy.orm import relationship, declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.sql.schema import ForeignKey

Base = declarative_base()
class User(Base):
    
    __tablename__ = 'users'

    user_id = Column(Integer, primary_key=True)
    name = Column(String)
    email = Column(String)
    password_id = Column(Integer, ForeignKey('password.password_id'))

    parent = relationship("Password", back_populates="users")

class Password(Base):
    
    __tablename__ = 'passwords'

    password_id = Column(Integer, primary_key=True)
    password = Column(String)
    last_change_date = Column(DateTime)
    valid_until = Column(DateTime)
    
    child = relationship("User", back_populates="passwords", uselist=False)

 

Вот схема БД для контекста:

db-schema

Я следую этому руководству из sql alchemy, но по какой-то причине я продолжаю получать сообщение об ошибке из заголовка «Убедитесь, что ссылочные столбцы связаны с ForeignKey или ForeignKeyConstraint, или укажите выражение ‘primaryjoin’.’, что странно, потому что в соответствии с тем, что я вижу в руководстве, мои классы былисопоставлено правильно, поэтому я не могу понять, почему возникает эта ошибка.

Заранее благодарю вас

Комментарии:

1. Не добавляйте отношения в оба класса. Добавьте связь только в класс паролей и удалите ее из класса пользователей

2. @HashirIrfan почему это? Разве пароли и пользователи не должны иметь взаимную привязку? Руководство, на которое я ссылался в сообщении, показывает, что и родительский, и дочерний элементы должны иметь отношения

3. Вы использовали обратные ссылки, чтобы получить к нему доступ через пользователя и пароль. Итак, вам просто нужно определить связь один раз

Ответ №1:

Я думаю, что проблема в следующей строке (имя таблицы в ForeignKey)…

password_id = столбец (целое число, ForeignKey(‘password.password_id’))

вместо пароля должны быть пароли.

Комментарии:

1. Это было оно! Сложный синтаксис… Спасибо!