day12-sqlalchemy 常用语法

本文详细介绍了使用ORM进行数据库操作的方法,包括数据的增删改查、条件筛选、数据更新及回滚等常见操作。

一、前言

  之前我们只是利用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()

 

转载于:https://www.cnblogs.com/zhangqigao/articles/7692676.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值