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

Posted

技术标签:

【中文标题】在 SQLAlchemy 中设计我的数据库模式时,我需要多久使用一次“backrefs”?【英文标题】:When designing my database schema in SQLAlchemy, how often do I need to use "backrefs"? 【发布时间】:2011-11-22 22:37:56 【问题描述】:

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

就是这样。

我为什么要使用 backref?

【问题讨论】:

【参考方案1】:

要了解 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))

这是一个非常简单的例子。现在如果你想访问addressesuser 那么你可以直接从user_id 属性中获取addresses 模型。这将返回user 中的id

如果您想要与此addresses 关联的user 的对象,那么您必须将get() 方法与user_id 一起使用。

现在,如果您想访问 addressesuser,则相反,您必须像这样运行查询

SELECT * FROM addresses WHERE user_id = $1

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

现在在我们的示例中,如果您将访问userobject.addresses,那么它将运行查询

SELECT * FROM addresses WHERE user_id = userobject.id

User 模型中没有类似addresses 的属性,这将由backrefAddress 模型的user 属性中设置。 p>

【讨论】:

以上是关于在 SQLAlchemy 中设计我的数据库模式时,我需要多久使用一次“backrefs”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQLAlchemy 中设置连接超时

使用 SQLAlchemy 生成数据库模式 [重复]

OCTOBERCMS 形式和模型

SQLAlchemy 关联表(关联对象模式)引发 IntegrityError

如何在 SQLAlchemy 中设置 M2M 混合计数属性?

tableview 没有用导航栏填满情节提要中的整个屏幕