как работают простые отношения SQLAlchemy? - PullRequest
26 голосов
/ 27 мая 2010

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

Однако, настраивая схему базы данных, я понял, что не понимаю некоторые концепции отношений с базой данных.

Если бы у меня были отношения многие-к-одному, например, статьи авторов (где каждая статья могла быть написана только одним автором), я бы поместил поле author_id в свой столбец articles. Но у SQLAlchemy есть этот объект ForeignKey и функция отношений с обратным kwarg, и я понятия не имею, что это значит.

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

Может кто-нибудь демистифицировать это для меня? Прямо сейчас я настраиваю, чтобы позволить openID auth для моего приложения. Итак, у меня есть это:

from __init__ import Base
from sqlalchemy.schema import Column
from sqlalchemy.types import Integer, String

class Users(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    username = Column(String, unique=True)
    email = Column(String)
    password = Column(String)
    salt = Column(String)


class OpenID(Base):
    __tablename__ = 'openid'
    url = Column(String, primary_key=True)
    user_id = #?

Я думаю, что ? следует заменить на Column(Integer, ForeignKey('users.id')), но я не уверен - и нужно ли ставить openids = relationship("OpenID", backref="users") в классе Users? Зачем? Что оно делает? Что такое обратная ссылка?

1 Ответ

41 голосов
/ 27 мая 2010

Да, вам нужно user_id = Column(Integer, ForeignKey('users.id')) или user_id = Column(Integer, ForeignKey('users.id'), nullable=False), если это обязательно. Это напрямую переводится в FOREIGN KEY в базовой схеме базы данных, без магии.

Простой способ объявления отношений - user = relationship(Users) в OpenID классе. Вы также можете использовать users = relationship('OpenID') в классе Users. Параметр backref позволяет объявлять обе связи одним объявлением: это означает автоматическую установку обратной связи в связанном классе. Лично я предпочитаю использовать backref -s только для самообращающихся отношений. Причина в том, что мне нравится самодокументированный код: когда вы просматриваете его определение, вы видите все определенные свойства, тогда как с backref вам нужно просматривать другие классы (вероятно, определенные в других модулях).

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