Вставка с помощью SQLAlchemy - PullRequest
1 голос
/ 12 июля 2011

Итак, у меня есть класс, определенный следующим образом:

class User(db.Model):
  id = db.Column(db.Integer, primary_key=True)
  username = db.Column(db.String(80), unique=True)
  email = db.Column(db.String(120), unique=True)
  hashed_password = db.Column(db.String(100))
  friends = db.relationship('User',
    backref='user', lazy='dynamic')


  def __init__(self, username, email, hashed_password):
    self.username = username
    self.email = email
    self.hashed_password = hashed_password
  def __repr__(self):
    return '<User %r>' % self.username

По сути, я хочу, чтобы у каждого пользователя был список пользователей (их друзей), но я не могу понять, является ли это правильным способом для моделирования этих отношений, и, если это кажется разумным, как бы я поступил о добавлении нового пользователя в список друзей другого пользователя?

1 Ответ

2 голосов
/ 12 июля 2011

Вам нужно взглянуть на свою проблему с точки зрения схемы базы данных, а затем написать код SQLAlchemy для генерации этой схемы. Это важно, потому что SA мало абстрагируется от генерации схемы, а ORM является отдельным компонентом (это один из лучших аспектов SQLAlchemy). Использование декларативного расширения не устраняет это различие.

В частности, вы объявляете relationship, который является конструкцией ORM, без каких-либо нижележащих столбцов и ограничений внешнего ключа. Что вам нужно сделать, это:

  1. определяет схему с Table с, Column с и Constraint с
  2. определяет relationship, который связывает классы Python вместе

В этом случае вам требуется отношение «многие ко многим» между пользователями, поэтому вам понадобится дополнительная таблица с (как минимум) двумя столбцами, оба из которых являются внешними ключами таблицы пользователей. Этот случай хорошо описан в документах SQLAlchemy , включая учебные пособия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...