python中sqlalchemy模块的使用二

上一篇 python中sqlalchemy模块的使用一 我们运用sqlalchemy写了最简单的增删改查,以及使用简单的sql语句进行查询,本片博客将会讲解一下使用in、count、group等的操作

废话不多说,咱们直接上代码:

1、使用in查询

def use_in():
    session = DBsession()
    users = session.query(User).filter(User.name.in_(['zhangsan','lisi'])).all()
    print([user for user in users])

执行结果:

sql:  SELECT user.user_name AS user_user_name, user.id AS user_id, user.age AS user_age 
FROM user 

WHERE user.user_name IN (%s, %s)

2、使用count统计

def use_count():
    session = DBsession()
    count = session.query(User).filter().count()
    print(count)

打印sql:

SELECT count(*) AS count_1 
FROM (SELECT user.user_name AS user_user_name, user.id AS user_id, user.age AS user_age 

FROM user) AS anon_1

3、使用group分组

from sqlalchemy import func

def use_group():
    session = DBsession()
    users = session.query(User.age,func.count(User.age)).group_by(User.age).all()
    print([user for user in users])

use_group()

打印sql:

SELECT user.age AS user_age, count(user.age) AS count_1 

FROM user GROUP BY user.age

返回结果:[(12, 2), (18, 1), (24, 1)]

4、使用关联查询

添加角色表:

class Role(BaseModel):
    # 表名
    __tablename__ = 'role'
    id = Column('id', Integer, primary_key=True, autoincrement=True)
    name = Column("role_name", String(20))

    def __repr__(self):
        return self.name
#定义对象
class User(BaseModel):
    #表名
    __tablename__='user'
    id = Column('id',Integer,primary_key=True,autoincrement=True)
    name = Column("user_name",String(20))#数据库中的字段名称为:user_name
    age = Column('age', Integer)

    role_id = Column('role_id',Integer)
    #方便输出,我们打印user时调用此方法
    def __repr__(self):
        return "id:%d,name:%s,age:%d" % (self.id, self.name, self.age)

用户表中添加了role_id字段

数据表:

user表:

role表:

def use_relation_query():
    session = DBsession()
    user_role_datas = session.query(User,Role).filter(User.role_id == Role.id).all()
    print([user_role_data for user_role_data in user_role_datas])

use_relation_query()

sql语句:

SELECT user.user_name AS user_user_name, user.id AS user_id, user.age AS user_age, user.role_id AS user_role_id, `role`.role_name AS role_role_name, `role`.id AS role_id 
FROM user, `role` 
WHERE user.role_id = `role`.id

结果:[(id:1,name:zhangsan,age:18, 超级管理员), (id:2,name:lisi,age:12, 超级管理员), (id:3,name:zhaoliu,age:24, 一般管理员)]


使用orm框架操作数据库给我们增加了很多方便,不需要我们自己去写sql,也不用关心内部实现的细节,当我们迁移的时候也不用考虑太多问题(比如从mysql迁移到oracle), 但这样也会让程序员对sql缺乏认识,写不出有效的sql,使用orm肯定会影响系统的性能,在使用orm框架时,希望学习者去打印orm生成的sql,去了解sql如何生成的,sql也是一门语言,也要多多了解一些,不能只停留在简单的sql上面,因为当你遇到系统瓶颈,想进一步去优化系统时,就需要你写一些高效的sql了


努力成就非凡,请不要在最该奋斗的年纪选择安逸

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值