在SQLAlchemy中设计我的数据库模式时,我需要多久使用一次“backrefs”?

时间:2011-11-22 22:37:56

标签: mysql database orm schema sqlalchemy

我来自Django世界,从未有过“backrefs”。我所做的就是定义ForeignKey。

就是这样。

为什么我会使用backref?

1 个答案:

答案 0 :(得分:4)

要了解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的{​​{1}},那么您可以直接从addresses属性获取user_id模型。这将返回addresses的{​​{1}}。

如果您想要id与此user相关联的对象,则必须使用user方法addresses

现在反过来说如果你想访问user_id的{​​{1}}那么你必须运行像

这样的查询
addresses

但是如果您将使用user,那么当您访问该属性时,sqlalchemy将运行此查询。

现在在我们的示例中,如果您将访问SELECT * FROM addresses WHERE user_id = $1 ,那么它将运行查询

backref

userobject.addresses模型中没有SELECT * FROM addresses WHERE user_id = userobject.id 这样的属性,这将由addresses模型的User属性backref设置。