sqlalchemy 常用语法

mac2022-06-30  23

一、前言

 

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

 

session.query(User).filter(User.id > 2).delete() #删除符合条件的 session.commit() 四、查询

4.1、查询所有字段

原生SQL:

SELECT * FROM USER WHERE NAME="xiaosusu"

 ①查询符合条件的所有数据

data = Session.query(User).filter_by(name='xiaosusu').all() #查询符合条件的所有数据,如果不需要条件,filter_by()就行 print(data) 输出: [<__main__.User object at 0x000001D4C92EC668> #把返回的数据映射成内存对象

 获取数据:

print(data[0].name,data[0].id,data[0].passwd) #输出 xiaosusu 1 qigao0808

 ②查询符合条件的第一条数据

data = Session.query(User).filter_by(name='xiaosusu').first() #查询满足条件的第1条数据 print(data) #输出 <__main__.User object at 0x000001FBEBD499B0> #同样返回的是内存对象

 获取数据:

print(data.name,data.id,data.passwd) #输出 xiaosusu 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:xiaosusu>, <id:2 name:shabihong>, <id:3 name:shuaisusu>]

 4.2、只查询需要的字段

原生SQL:

select user.name,user.passwd from user where name="xiaosusu"

orm表示:

data = Session.query(User.name,User.passwd).filter_by(name='xiaosusu').first() #只查询name和passwd的信息 print(data.name,data.passwd) #输出 xiaosusu susu0808

 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, 'xiaosusu')]  

 原生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/xiangjun555/articles/8029608.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)