一、前言
之前我们只是利用orm创建表,和如何往表里面插入数据,现在我们就来学学利用orm,如何去增删改查。
二、新增数据
2.1、新增一条数据
obj = Users(name="xiaohong", extra='sb')
session.add(obj) #新增一条数据
session.commit()
2.2、新增多条数据
obj1 = Users(name="xiaohong", extra='sb')
obj2 = Users(name="xiaohong2", extra='sb')
session.add_all([obj1,obj2,]) #插入多条记录
session.commit()
三、删除
3.1、删除信息
session.query(Users).filter(Users.id > 2).delete() #删除符合条件的
session.commit()
四、查询
4.1、查询所有字段
原生SQL:
SELECT * FROM USER WHERE NAME="zhangqigao"
①查询符合条件的所有数据
data = Session.query(User).filter_by(name='zhangqigao').all() #查询符合条件的所有数据,如果不需要条件,filter_by()就行
print(data)
输出:
[<__main__.User object at 0x000001D4C92EC668> #把返回的数据映射成内存对象
获取数据:
print(data[0].name,data[0].id,data[0].passwd)
#输出
zhangqigao 1 qigao0808
②查询符合条件的第一条数据
data = Session.query(User).filter_by(name='zhangqigao').first() #查询满足条件的第1条数据
print(data)
#输出
<__main__.User object at 0x000001FBEBD499B0> #同样返回的是内存对象
获取数据:
print(data.name,data.id,data.passwd)
#输出
zhangqigao 1 qigao0808
不过刚才上面的显示的内存对象对址你是没办法分清返回的是什么数据的,除非打印具体字段看一下,如果想让它变的可读,只需在定义表的类下面加上这样的代码:
class User(Base):
__tablename__ = "user" #表名
id = Column(Integer,primary_key=True)
name = Column(String(32))
passwd = Column(String(64))
def __repr__(self): #使返回的内存对象变的可读
return "<id:{0} name:{1}>".format(self.id,self.name)
Base.metadata.create_all(engine) #这边的意思是创建定义所有的表
Session_class = sessionmaker(bind=engine)
Session = Session_class() #创建session会话,相当于创建一个cursor
data = Session.query(User).filter_by().all() #获取所有数据
print(data)
#输出
[<id:1 name:zhangqigao>, <id:2 name:shabihong>, <id:3 name:shuaigaogao>]
4.2、只查询需要的字段
原生SQL:
select user.name,user.passwd from user where name="zhangqigao"
orm表示:
data = Session.query(User.name,User.passwd).filter_by(name='zhangqigao').first() #只查询name和passwd的信息
print(data.name,data.passwd)
#输出
zhangqigao qigao0808
4.3、所有的查询
ret = session.query(Users).all() #查询所有
ret = session.query(Users.name, Users.extra).all() #只查询name和extra字段
ret = session.query(Users).filter_by(name='alex').all() #查询name='alex'的所有数据
ret = session.query(Users).filter_by(name='alex').first()#查询name='alex'的第一条数据
#查询以User.id排序的数据
ret = session.query(Users).filter(text("id<:value and name=:name")).params(value=224, name='fred').order_by(User.id).all()
#根据原生sql查询数据
ret = session.query(Users).from_statement(text("SELECT * FROM users where name=:name")).params(name='ed').all()
4.4、查询比较大小的
说明:之前我们过滤都是filter_by,现在我们用filter过滤,都是过滤比较数值大小的,比如:>,<,==等。
data = Session.query(User).filter(User.id>2).all()
print(data)
#输出
[<id:2 name:shabihong>]
五、更新、修改
5.1、修改数据
①第一种方式
data = Session.query(User).filter_by(name="zhangqigao").first() #获取数据
data.name = "gaogege" #修改数据
Session.commit() #提交
②第二种方式
session.query(Users).filter(Users.id > 2).update({"name" : "099"})
session.query(Users).filter(Users.id > 2).update({Users.name: Users.name + "099"}, synchronize_session=False)
session.query(Users).filter(Users.id > 2).update({"num": Users.num + 1}, synchronize_session="evaluate")
session.commit()
5.2、回滚
qigao_user = User(name="rain",passwd="0707")
Session.add(qigao_user)
print(Session.query(User).filter(User.name.in_(['shabihong','rain'])).all() ) #这时看session里有你刚添加和修改的数据
Session.rollback()
print(Session.query(User).filter(User.name.in_(['shabihong','rain'])).all() ) #再查就发现刚才添加的数据没有了。
六、获取所有数据
6.1、获取所有数据
data = Session.query(User.name,User.id).all() #获取所有数据
print(data)
6.2、多条件查询
data = Session.query(User).filter(User.id>2).filter(User.id<=4).all()
print(data)
上面2个filter的关系相当于 user.id >1 AND user.id <=4 的效果
七、其他
7.1、统计
data = Session.query(User).filter(User.name.like("%qigao%")).count() #模糊匹配qigao的个数
print(data)
输出:
1
7.2、分组
from sqlalchemy import func
data = Session.query(func.count(User.name),User.name).group_by(User.name).all() #根据User.name分组
print(data)
#输出
[(1, 'gaogege'), (1, 'luotianshuai'), (1, 'mingming'), (2, 'rain'), (1, 'shabihong'), (1, 'shuaigaogao'), (1, 'zhangqigao')]
原生SQL:
SELECT count(user.name) AS count_1, user.name AS user_name
FROM user GROUP BY user.name
7.3、条件
ret = session.query(Users).filter_by(name='alex').all()
ret = session.query(Users).filter(Users.id > 1, Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.between(1, 3), Users.name == 'eric').all()
ret = session.query(Users).filter(Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(~Users.id.in_([1,3,4])).all()
ret = session.query(Users).filter(Users.id.in_(session.query(Users.id).filter_by(name='eric'))).all()
7.4、and和or
from sqlalchemy import and_, or_
ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all()
ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all()
ret = session.query(Users).filter(
or_(
Users.id < 2,
and_(Users.name == 'eric', Users.id > 3),
Users.extra != ""
)).all()
7.5、通配符
ret = session.query(Users).filter(Users.name.like('e%')).all()
ret = session.query(Users).filter(~Users.name.like('e%')).all()
7.6、限制数据条数
ret = session.query(Users)[1:2]
7.7、排序
ret = session.query(Users).order_by(Users.name.desc()).all()
ret = session.query(Users).order_by(Users.name.desc(), Users.id.asc()).all()
7.8、分组
from sqlalchemy.sql import func
ret = session.query(Users).group_by(Users.extra).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).all()
ret = session.query(
func.max(Users.id),
func.sum(Users.id),
func.min(Users.id)).group_by(Users.name).having(func.min(Users.id) >2).all()