AssociationProxywitheagerloadingandAsyncSession
创始人
2024-09-20 19:30:11
0

使用Python的SQLAlchemy库,可以使用异步会话(AsyncSession)从数据库中使用AssociationProxy来进行查询,同时使用预处理方式(eager loading)来提高查询效率。

下面是一个示例代码:

from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.orm import declarative_base, relationship, Session
from sqlalchemy.ext.associationproxy import association_proxy

Base = declarative_base()


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

    addresses = relationship("Address", back_populates="user")

    all_addresses = association_proxy('addresses', 'email')


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")

engine = create_async_engine('postgresql+asyncpg://user:password@localhost/mydatabase')

async with engine.begin() as conn:
    await conn.run_sync(Base.metadata.drop_all)
    await conn.run_sync(Base.metadata.create_all)

async with AsyncSession(engine) as session:
    async with session.begin():
        # create objects
        user1 = User(name='user1', addresses=[Address(email='address1')])
        user2 = User(name='user2', addresses=[Address(email='address2'), Address(email='address3')])
        user3 = User(name='user3', addresses=[Address(email='address4')])
        session.add_all([user1, user2, user3])

    async with session.begin():
        # query objects using AssociationProxy and eager loading
        users = await session.execute(
            select(User).options(joinedload(User.addresses)).order_by(User.id)
        )
        for user in users.scalars():
            print(user.name, user.all_addresses)

    session: Session = session
    await session.commit()

在这个示例中,我们首先定义了两个模型类User和Address,并使用了association_proxy方法来生成all_addresses属性,指向User对象下的Address表中的email属性。然后我们使用AsyncSession和create_async_engine方法创建了一个异步会话和数据库引擎,并且连接到了一个名为'mydatabase'的postgres数据库。

接着,我们在数据库中生成了模型类对应的表,并且向其中插入了一些示例数据。最后,我们查询了所有用户的所有地址,并将得到的结果输出到控制台中。

这里我们使用了options方法中的joinedload来进行预处理,这是一种方法

相关内容

热门资讯

透视安装“全游大厅拼十辅助”往... 全游大厅拼十辅助开挂教程视频分享装挂详细步骤在当今的网络游戏中,全游大厅拼十辅助作为一种经典的娱乐方...
我来教大家“创思维激k透视源码... 大家好,今天小编来为大家解答创思维激k透视源码这个问题咨询软件客服可以免费测试直接加微信(13670...
记者揭秘“途游辅助软件”从来有... 途游辅助软件是一款专注玩家量身打造的游戏记牌类型软件,在途游辅助软件这款游戏中我们可以记录下每张牌的...
如何分辨真伪“江湖悠悠游戏辅助... 【亲,江湖悠悠游戏辅助 这款游戏可以开挂的,确实是有挂的,很多玩家在这款江湖悠悠游戏辅助中打牌都会发...
终于知道“花花生活圈辅助”往昔... 终于知道“花花生活圈辅助”往昔有辅助安装(有挂教程);无需打开直接搜索加薇136704302(咨询了...
信息共享“poker mast... 信息共享“poker master辅助”固有有开挂辅助工具(证实有挂)您好:poker master...
玩家必看秘籍“朋朋政和辅助器免... 朋朋政和辅助器免费在哪里是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可...
推荐一款“wepoker可以免... 推荐一款“wepoker可以免费玩吗”从来有开挂辅助下载(有挂解密)您好:wepoker可以免费玩吗...
今日焦点“新道游正版辅助微信辅... 今日焦点“新道游正版辅助微信辅助”往昔有辅助开挂平台(有挂攻略);无需打开直接搜索加(薇:13670...
玩家实测“桂林老k字牌免费安装... 桂林老k字牌免费安装是一款专注玩家量身打造的游戏记牌类型软件,在桂林老k字牌免费安装这款游戏中我们可...