При проектировании схемы базы данных в SQLAlchemy, как часто мне нужно использовать «backrefs»? - PullRequest
2 голосов
/ 23 ноября 2011

Я родом из мира Джанго и у меня никогда не было "обратных ссылок". Все, что я сделал, это определил ForeignKey.

Вот и все.

Зачем мне использовать backref?

1 Ответ

4 голосов
/ 23 ноября 2011

Для понимания backref, пожалуйста, проверьте приведенный пример

from sqlalchemy import create_engine, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from sqlalchemy import Column, Integer, String
from sqlalchemy import Table, Text

engine = create_engine('mysql://root:ababab@localhost/alctest',
            echo=False)

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key = True)
    name = Column(String(100))
    fullname = Column(String(100))
    password = Column(String(100))

    def __init__(self, name, fullname, password):
        self.name = name
        self.fullname = fullname
        self.password = password

        def __repr__(self):
        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key = True)
    email_address = Column(String(100), nullable=False)

    #foreign key, must define relationship
    user_id = Column(Integer, ForeignKey('users.id'))
    user = relationship("User", backref = backref('addresses',order_by=id))

Это очень простой пример. Теперь, если вы хотите получить доступ к user из addresses, вы можете напрямую получить атрибут user_id, если addresses модель. Это вернет вам id из user.

Если вам нужен объект user, который связан с этим addresses, то вы должны использовать get() метод с user_id.

Теперь в обратном случае, если вы хотите получить доступ к addresses из user, тогда вы должны выполнить запрос как

SELECT * FROM addresses WHERE user_id = $1

Но если вы будете использовать backref, то sqlalchemy будет запускать этот запрос при доступе к этому атрибуту.

Теперь в нашем примере, если вы получите доступ к userobject.addresses, он запустит запрос

SELECT * FROM addresses WHERE user_id = userobject.id

Нет атрибута типа addresses в User модели, который будет установлен backref из Address атрибута user модели.

...