110.SQLAlchemy中子表的查询


from random import randint,choice
from sqlalchemy import Column, Integer, String,ForeignKey,func
from sqlalchemy.orm import relationship,backref
from util_db import Base, Session


class User(Base):
    __tablename__ = 't_user'
    id = Column(Integer, primary_key = True, autoincrement=True)
    name = Column(String(32))
    age = Column(Integer)

    def __repr__(self):
        return f'<User: id={self.id} name = {self.name} age = {self.age}>'


def create_data():
    Base.metadata.drop_all()
    Base.metadata.create_all()
    names = ['百战','尚学堂','百战程序','北京尚学堂']
    with Session() as ses:
        for i in range(20):
            user = User(name=choice(names), age = randint(3,10))
            ses.add(user)
        ses.commit()

def query_data_old():
    '''
    select u.id,u.age from t_user u where (
        select name, age from t_user where name="百战") z
    z.name = u.name and u.age=z.age
    '''
    # 获取一个名为百战的人, 获取与他同名同年龄的人
    with Session() as ses:
        # 执行了两次才出结果
        u = ses.query(User).filter(User.name == "百战").first()
        users = ses.query(User).filter(u.age == User.age, u.name == User.name).all()
        print(users)

def query_data_new():
    with Session() as ses:
        # 生成一个子查询sql语句,不是结果!!!
        #                           改名字,类似于sql中的AS                                                这里不能和old一样写first(),因为生成的是sql,只可以使用limit得到第一条数据
        #          
        sub_sql = ses.query(User.name.label('uname'), User.age.label('uage')).filter(User.name == "百战").limit(1).subquery() # subquery用于告诉这是子查询语句
       #                            获取子查询中的参数得通过c来获取
        rs = ses.query(User).filter(User.name == sub_sql.c.uname, User.age==sub_sql.c.uage).all()
        print(rs)

if __name__ == "__main__":
    # create_data()
    # query_data_old()
    query_data_new()

SQLAlchemy 中,可以使用 ORM 进行关系数据库的操作。当需要进行连查询时,可以使用 SQLAlchemy 的 join() 方法来实现。 首先,需要导入必要的模块: ```python from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine, join from sqlalchemy.ext.declarative import declarative_base ``` 其中,create_engine() 方法用于创建一个数据库引擎,sessionmaker() 方法用于创建一个数据库会话,declarative_base() 方法用于创建一个基类,该基类可以被所有的 ORM 类继承。 然后,需要定义 ORM 类: ```python Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) email = Column(String) address = Column(String) phone = Column(String) class Order(Base): __tablename__ = 'orders' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('users.id')) product = Column(String) quantity = Column(Integer) price = Column(Float) ``` 最后,可以通过 join() 方法来实现连查询: ```python engine = create_engine('mysql+pymysql://user:password@host/dbname?charset=utf8') Session = sessionmaker(bind=engine) session = Session() result = session.query(User, Order).filter(User.id == Order.user_id).all() for user, order in result: print(user.name, order.product) ``` 以上代码会输出每个用户的姓名和他们对应的订单商品名称。 在连查询时,需要通过 filter() 方法来指定关联条件,这里使用了 User.id 和 Order.user_id 进行关联。在查询结果中,每个元组包含了 User 和 Order 类的实例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想成为数据分析师的开发工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值