sqlalchemy中的orm让我们可以很方便的采用类似python对象的方式去操作数据库,非常的方便实现增删改查的各种功能,下面一一陈述
值得一说的是,sqlalchemy中的对象分为四种状态
Transient:短暂的,主要指内存中的对象
Pending:挂起的,这样的对象准备插入数据库,等执行了flush就会插入
Persistent:持久的
Detached:对象在数据库里面有记录,但是不属于session
1.添加数据
当我们使用类似
admin_group = Admin_group()
admin_group.name = 'aaaa'
admin_group.limit = '1'
admin_group.create_time = time.time()
或者
admin_group = Admin_group(name=name,limit = '1',create_time=time.time())
时,会创建一个python对象,此时处于 Transient状态
暂时与sqlalchemy的session没什么关系
在使用
self.orm.add(admin_group)
self.orm为一个session对象
此时admin_group为Pending状态,处于session管理之下,但没有在数据库中有记录
self.orm.commit()
现在向数据库中提交session,现在 admin_group为Persistent状态,处于session管理,而且在数据库中也有记录
与未commit之前有很明显的区别的就是,那些有数据库管理的默认字段或者是自增字段会赋值给python对象,
在commit之前,会发现admin_group.id==None,commit之后会出现数值
在commit之后,sqlalchemy会新展开一个事务,并刷新上一个事务中的对象
当调用self.orm.close()时,session被关闭,此时admin_group处于Detached,不在session管理之下,废话,因为session已经关闭了,当然不在额
2.修改数据
在上述commit之后,admin_group的值仍可以被修改,
此时admin_group.name='aaaa'
我们使用
admin_group.name='bbbb'
self.orm.commit()
可以把数据库中对应行name字段改为bbbb
当然也可以配合查询直接修改
self.orm.query(Admin_group).filter(Admin_group.id == id).update({
'name': name
}, synchronize_session=False)
self.orm.commit()
3.删除数据
self.orm.query(Admin_group).filter(Admin_group.id.in_(groups)).delete(synchronize_session=False)
self.orm.commit()
或者
self.orm.delete(admin_group)
self.orm.commit()
4.查询数据
查询的东西最多,放到最后说
说到查询,就不得不说Query对象,
Query对象有我们查询的各种因素
上案例
1.
select * from admin_group
是
</pre><pre name="code" class="sql">self.orm.query(Admin_group).all()
2.
select admin_group.id,admin_group.name from admin_group
是
self.orm.query(Admin_group.id, Admin_group.id.name).all()
select * from admin_group where id=1
是
</pre><pre name="code" class="sql">
self.orm.query(Admin_group).filter(Admin_group.id==1).all()
或
self.orm.query(Admin_group).get(1)
因为filter函数返回值也是一个Query对象,所以可以直接级联
self.orm.query(Admin_group).filter(Admin_group.id==1).filter(Admin_group.name=='bbbb').all()
不仅仅可以用all() 也可以直接用python的切片取一部分数据
select * from admin_group limit 2 offset 1
是
self.orm.query(Admin_group).filter(Admin_group.id==1)[1:3]
还有很多其他查询
• equals:
query.filter(User.name == ’ed’)
• not equals:
query.filter(User.name != ’ed’)
• LIKE:
query.filter(User.name.like(’%ed%’))
• IN:
query.filter(User.name.in_([’ed’, ’wendy’, ’jack’]))
query.filter(User.name.in_( session.query(User.name).filter(User.name.like(’%ed%’))
))
• NOT IN:
query.filter(~User.name.in_([’ed’, ’wendy’, ’jack’]))
• IS NULL:
query.filter(User.name == None)
query.filter(User.name.is_(None))
• IS NOT NULL:
query.filter(User.name != None)
query.filter(User.name.isnot(None))
• AND:
from sqlalchemy import and_
query.filter(and_(User.name == ’ed’, User.fullname == ’Ed Jones’))
query.filter(User.name == ’ed’, User.fullname == ’Ed Jones’)
query.filter(User.name == ’ed’).filter(User.fullname == ’Ed Jones’)
• OR:
from sqlalchemy import or_
query.filter(or_(User.name == ’ed’, User.name == ’wendy
• MATCH: query.filter(User.name.match(’wendy’))