天天看点

sqlalchemy系列(2) orm相关简易操作

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已经关闭了,当然不在额

sqlalchemy系列(2) orm相关简易操作

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’))