美文网首页
SQLAlchemy中“一对多”场景下的排序取数

SQLAlchemy中“一对多”场景下的排序取数

作者: 北邮郭大宝 | 来源:发表于2021-04-30 16:24 被阅读0次

Python操作数据库表时常用SQLAlchemy做ORM,把关系数据库的表结构映射到对象上,并通过relationship做外键关联,方便进一步处理。

假设需要实现某个“一对多”的场景,从“一”这头需要取出“多”那头的全部对象,并按某个字段做排序,如何实现呢?

话不多说,show code。

本例使用sqlite3做数据库,创建Project和User两张表,两者是一对多关系。
核心是在User表中通过backref做反向引用时声明order_by即可。

from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker, backref, foreign, relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()


class Project(Base):
    __tablename__ = "project"

    id = Column(Integer, primary_key=True)
    name = Column(String(20))

    def __repr__(self):
        return "<Project(id='%d', name='%s')>" % (self.id, self.name)


class User(Base):
    __tablename__ = "user"

    id = Column(Integer, primary_key=True)
    name = Column(String(20))
    project_id = Column(Integer)
    project = relationship(Project, primaryjoin=foreign(project_id) == Project.id,
                             backref=backref("users", order_by=id.desc()))

    def __repr__(self):
        return "<User(id='%d', name='%s', project_id='%d')>" % (self.id, self.name, self.project_id)


#  init database and create tables
def init_db():
    engine = create_engine('sqlite:///test.db')
    smaker = sessionmaker(bind=engine)
    session = smaker()

    Base.metadata.create_all(engine)
    return engine, smaker, session


#  prepare data
def init_data(session):
    project = Project(name='Project_A')
    session.add(project)
    session.commit()

    user_a = User(name='user_a', project_id=project.id)
    user_b = User(name='user_b', project_id=project.id)
    session.add_all([user_a, user_b])
    session.commit()


def main():
    engine, smaker, session = init_db()
    init_data(session)

    # test 
    projects = session.query(Project).all()
    for p in projects:
        print(p.users)


if __name__ == '__main__':
    main()

结果如图,可以看到User对象是按照id倒序排列。


1619770765752.jpg

参考:

相关文章

  • SQLAlchemy中“一对多”场景下的排序取数

    Python操作数据库表时常用SQLAlchemy做ORM,把关系数据库的表结构映射到对象上,并通过relatio...

  • python最牛web框架居然是“它”

    sqlalchemy中的表关系 表之间的关系存在三种:一对一、一对多、多对多。而SQLAlchemy中的ORM...

  • 3.5 SQLAlchemy的表关系

    SQLAlchemy的ORM(4) 表关系: 表之间的关系存在三种:一对一、一对多、多对多。而SQLAlchemy...

  • SQLAlchemy

    SQLAlchemy_建表(一对一/一对多/多对多)关系 Basic Relationship Patterns ...

  • sqlalchemy表关联查询

    一. 一对多, 一对一,多对多 参考文档: https://docs.sqlalchemy.org/en/13...

  • mysql ---多对多

    flask的orm框架(SQLAlchemy)-一对多查询以及多对多查询(venv) $ pip install...

  • 十一、SQLAlchemy的多对多关系

    1.前言 上篇文章说了SQLAlchemy中的外键约束,这篇文章就来说一下SQLAlchemy中的多对多关系如何去...

  • 我眼中后台产品设计的“信达雅”

    信: 以逻辑关系为基础(一对一,一对多,多对多),结合使用场景,实现各种数据基本的增删改查,状态更新,排序。功能简...

  • 第十四节-排序优化

    优化快速排序 三数取中法,九数取中法 随机法 限制递归深度 自己实现函数调用栈,手动模拟入栈出栈 举例分析排序函数...

  • 冒泡排序

    排序方法 相邻两个数比较, 第一个数大于第二个数就交换位置,从第一对数到最后一对为一轮,重复多轮直到排序完成。每一...

网友评论

      本文标题:SQLAlchemy中“一对多”场景下的排序取数

      本文链接:https://www.haomeiwen.com/subject/oznnrltx.html