【问题标题】:Add relationship backref order_by with alembic使用 alembic 添加关系 backref order_by
【发布时间】:2020-11-04 11:13:50
【问题描述】:

我最近将 Alembic 添加到我的 Flask 项目中,现在我的 SQLAlchemy 关系排序与 order_by 不再有效。我相信这是因为运行的迁移文件没有获取 order_by 参数,我不知道如何获取它。

我的模型看起来像...

class Project(db.Model):
    __tablename__ = 'project'

    id = db.Column(db.Integer(), primary_key=True)


class User(db.Model):
    __tablename__ = 'user'

    id = db.Column(db.Integer(), primary_key=True)
    project_id = db.Column(db.ForeignKey(Project.id, ondelete="cascade"), index=True, nullable=False)
    project = db.relationship(Project, backref='members', order_by="User.id.desc()")

在 Alembic 迁移中,我看到以下内容...

    ...

op.create_table('user',
    sa.Column('id', sa.Integer(), nullable=False),
    sa.Column('project_id', sa.Integer(), nullable=False),
    ...
    sa.ForeignKeyConstraint(['project_id'], ['project.id'], ondelete='cascade'),
)
op.create_index(op.f('ix_user_project_id'), 'user', ['project_id'], unique=False)

...

查看迁移,我不太确定 SQLAlchemy 是如何实际处理这种关系的,因为我没有看到任何地方提到的任何类型的 backref,我猜 SQLAlchemy 只是运行一个查询来获取项目的用户。

任何帮助将不胜感激!

【问题讨论】:

    标签: flask sqlalchemy alembic flask-migrate


    【解决方案1】:

    迁移文件是正确的,在数据​​库级别没有backref,只有创建的外键链接用户实体和项目。 事实上,正如您所说,sqlalchemy 将在您第一次访问用户的user.project 属性时发出一个新查询,加入 project_id 字段。顺便说一句,如果您想在查询用户时完全加入项目的列,您应该使用joinedload option

    关于关系声明中使用的“order_by”,它只适用于加载的关系,例如官方文档中的这个例子:

    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        children = relationship("Child", order_by="Child.id")
    

    在上面的例子中,当访问parent.children时,结果会按照孩子的ID排序。

    在您的情况下,这没有意义,因为它是多对一的关系,并且对于每个用户,您只有一个项目。也许你应该把它移到项目模型中:

    class Project(db.Model):
        __tablename__ = 'project'
    
        id = db.Column(db.Integer(), primary_key=True)
        members = db.relationship('User', backref='project', order_by='User.id.desc()')
    

    这样,每当您访问项目的project.members 属性时,您都会得到一个排序的用户列表。

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2016-07-30
      • 1970-01-01
      • 2015-04-30
      • 2020-06-09
      • 2017-06-08
      相关资源
      最近更新 更多