我想根据他们的codemobile number来查询一个user.

值得注意的是,我在连接到数据库时使用的是异步会话.

这是我的机型和疑问:

class model_user(Base):
    __tablename__ = "users"
    id = Column(UUID)
    code = Column(Integer)
    user_name = Column(String(11), unique=True)
    first_name = Column(String(255), index=True)
    last_name = Column(String(255), index=True)
    contact = relationship("model_contact", back_populates="user")

class model_contact(Base):
    __tablename__ = "contacts"
    id = Column(Integer)
    mobile = Column(String(320))
    user_id = Column(
        UUID(as_uuid=True), ForeignKey("users.id"), nullable=False, index=True
    )
    user = relationship("model_user", back_populates="contact")


# Here is my query:
query = await db.execute(
    select(user_model)\
    .filter_by(code==5)\
    .options(
        joinedload(model_user.contact)
    )\
    .filter(model_contact.mobile == mobile)

推荐答案

这实际上与您是否使用SQLAlChemy的async扩展没有任何关系.查询的构造方式相同.只是会话设置和交互明显不同.

附注:

  1. 您应该使用PascalCase来命名您的类,并且在名称中包含术语"模型"通常不是很好的风格,例如UserContact.
  2. 由于您的用户模型和联系人模型之间存在一对多关系(即一个用户可以有多组联系人信息),因此您应该使用复数来命名用户模型上的关系属性,即contacts.

我能想到的做你想做的事情的最简单的方法是使用Select.where方法.然后,您可以使用关系的any方法构造SQL EXISTS子查询.声明将如下所示:

statement = select(User).where(
    User.code == 123,
    User.contacts.any(Contact.mobile == "555")
)

下面是一个使用aiosqlite的完整工作示例,以证明它与async个工具一起工作:

from asyncio import run

from sqlalchemy import Column, ForeignKey, Integer, String, select
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, sessionmaker


Base = declarative_base()


class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    code = Column(Integer)
    contacts = relationship("Contact", back_populates="user")


class Contact(Base):
    __tablename__ = "contacts"
    id = Column(Integer, primary_key=True)
    mobile = Column(String(320))
    user_id = Column(
        Integer(), ForeignKey("users.id"), nullable=False, index=True
    )
    user = relationship(User, back_populates="contacts")


async def main():
    engine = create_async_engine("sqlite+aiosqlite://", echo=True)
    async with engine.begin() as conn:
        await conn.run_sync(Base.metadata.create_all)

    async_session = sessionmaker(
        engine, expire_on_commit=False, class_=AsyncSession
    )
    async with async_session() as session:
        statement = select(User).where(
            User.code == 123,
            User.contacts.any(Contact.mobile == "555")
        )
        await session.execute(statement)


if __name__ == "__main__":
    run(main())

运行此脚本将为select查询生成以下SQL输出:

SELECT users.id, users.code 
FROM users 
WHERE users.code = ? AND (EXISTS (SELECT 1 
FROM contacts 
WHERE users.id = contacts.user_id AND contacts.mobile = ?))
...
(123, '555')

这种方法应该会给您带来您想要的结果.

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

为什么tkinter框架没有被隐藏?

SQLGory-file包FilField不允许提供自定义文件名,自动将文件保存为未命名

如何使用matplotlib在Python中使用规范化数据和原始t测试值创建组合热图?

如何在Python中将returns.context. DeliverresContext与Deliverc函数一起使用?

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

Python中绕y轴曲线的旋转

移动条情节旁边的半小提琴情节在海运

给定高度约束的旋转角解析求解

调用decorator返回原始函数的输出

在www.example.com中使用`package_data`包含不包含__init__. py的非Python文件

lityter不让我输入左边的方括号,'

如何创建引用列表并分配值的Systemrame列

如何在Python请求中组合多个适配器?

如何合并具有相同元素的 torch 矩阵的行?

计算机找不到已安装的库'

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

如果列包含空值,则PANAS查询不起作用

使用pythonminidom过滤XML文件

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?