@Dejcv2

Как правильно создать отношение one to many в sqlalchemy?

Приветствую!

Пытаюсь создать связь между двумя таблицами (one to many)
class Users(Base):
    __tablename__ = 'users'

    id: Mapped[int] = mapped_column(primary_key=True)
    user_id: Mapped[int] = mapped_column(BigInteger)
    user_name: Mapped[str] = mapped_column(String(32), nullable=True)
    bots: Mapped[int] = mapped_column(default=0)
    earnings: Mapped[int] = mapped_column(default=0)
    partnership_balance: Mapped[int] = mapped_column(default=0)
    account: Mapped[int] = mapped_column(default=0)
    referrer_id: Mapped[int] = mapped_column(BigInteger, nullable=True)
    notification: Mapped[bool] = mapped_column(default=True)
    tokens = relationship(argument='Tokens', backref='users')


class Tokens(Base):
    __tablename__ = 'tokens'

    id: Mapped[int] = mapped_column(primary_key=True)
    token: Mapped[str] = mapped_column(String(50))
    user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey('users.id'))


Во время наполнения таблицы users всё происходит нормально, данные становятся на свои места, но когда пытаюсь наполнить вторую таблицу, то выскакивает исключение: null value in column "user_id" of relation "tokens" violates not-null constraint. Разве user_id не должен заполниться автоматически?
  • Вопрос задан
  • 280 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Munchen777
Если вы хотите сделать так, что у одного пользователя может быть несколько токенов(one-to-many), то вам нужно в таблице Tokens создать этого пользователя(user). Также, если у вас первичные ключи, то лучше для наглядности указывать autoincrement=True.

class Tokens(Base):
__tablename__ = 'tokens'

id: Mapped[int] = mapped_column(primary_key=True)
token: Mapped[str] = mapped_column(String(50))
user_id: Mapped[int] = mapped_column(BigInteger, ForeignKey('users.id'))
user: Mapped['User'] = relationship('User', back_populates='tokens')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы