上一篇 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了
努力成就非凡,请不要在最该奋斗的年纪选择安逸