sqlalchemy的使用总结

sqlalchemy的概念已经太多网站可以查到,在这里不再赘述,直接说如何使用

  1. 创建,创建的表和MySQL中的表要一一对应,实际上这个就是和MySQL的表的映射关系
  2. 增加
			xz_adcodes = XzBranches.session.query(XzBranches).all()
            for i in xz_adcodes:
                article1 = CodeBranches(name=i.name, adcode=i.adcode,citycode=i.citycode)
                CodeBranches.session.add(article1)
                CodeBranches.session.commit()
        其中XzBranches和CodeBranches是两个数据表,以上的操作等价于

insert into gd_adcode_count(name,adcode,citycode) select name,adcode,citycode from xz_city_adcode
将表xz_city_adcode 中的数据复制到gd_adcode_count这个表中。

xz_adcodes = XzBranches.session.query(XzBranches).all() -------------> all() 函数表示获取到全部的信息,但是这里的信息必须要遍历才会出现,否则会返回一个对象

article1 = CodeBranches(name=i.name, adcode=i.adcode,citycode=i.citycode)
CodeBranches.session.add(article1)
这两句话是指将获取到的值依次的插入到表CodeBranches 中

最后要注意,一定要提交,否则是无效的
3. 更新

sql2 = "update gd_adcode_count set keywords='%s' where keywords is null"%self.names[i]

等价于:

CodeBranches.session.query(CodeBranches).filter_by(keywords=None).update({"keywords": self.names[i]})
CodeBranches.session.commit()

整句话用中文解释一下就是: 将关键字为空的字段,全部填写为self.names[0] 的字段。
其中,值得一提的是,我们要如何表达关键字为空,在这里,网上的很多用法都是错误的
我们应该写成keywords=None,不是== , 并且None 也不需要加引号。

还有就是,update是需要写成字典的形式,而不是依次赋值,这样也是错的。

4 查询

今天写查询的时候发现,查询key不为空的时候,无法查询,所以看了一下别人都是怎么写的,发现不仅仅有filter_by() 这个函数,还有filter() 这个函数,filter() 中可以使用 != 等符号,但是filter_by 是不可以的

还有就是查询之后的函数的使用:

print( session.query(User).filter(User.username=='jingqi').all() )
print( session.query(User).filter(User.username=='jingqi').first())
print( session.query(User).filter(User.username=='jingqi').one())#结果为一个时正常,多了就报错
print( session.query(User).get(2))#通过id查询

使用limit offset slice等函数进行查询

#限制查询返回结果
print( session.query(User).filter(User.username!='jingqi').limit(2).all())
print( session.query(User).filter(User.username!='jingqi').offset(2).all())
print( session.query(User).filter(User.username!='jingqi').slice(2,3).all())
 #可以排序之后再进行限制
 from sqlalchemy import desc
 print( session.query(User).filter(User.username!='budong').order_by(User.username).all())
 print( session.query(User).filter(User.username!='budong').order_by(desc(User.username)).slice(1,3).all())

第一个是限制返回条数,从第一条开始;第二个是从第三条开始返回查询结果;第三个是切片返回记录。

order_by默认是顺序,desc是降序。

其他的函数查询,注意:模糊匹配是十分耗费时间的,能不用就尽量不要用。

#不等于
print( session.query(User).filter(User.username!='jingqi').all() )
#模糊匹配 like
print( session.query(User).filter(User.username.like('jingqi')).all() )
print( session.query(User).filter(User.username.notlike('jingqi')).all() )
#成员属于  in_
print( session.query(User).filter(User.username.in_(['jingqi','jingqi1'])).all() )
#成员不属于  notin_
print( session.query(User).filter(User.username.notin_(['jingqi','jingqi2'])).all() )
#空判断
print( session.query(User).filter(User.username==None).all() )
print( session.query(User).filter(User.username.is_(None)).all() )
print( session.query(User).filter(User.username.isnot(None)).all() )
#多条件
print( session.query(User).filter(User.username.isnot(None),User.password=='qwe123').all() )
#选择条件
from sqlalchemy import or_,and_,all_,any_
print( session.query(User).filter(or_(User.username=='jingqi',User.password=='qwe123')).all() )
print( session.query(User).filter(and_(User.username=='jingqi2',User.password=='111')).all() )

聚合函数的使用

from sqlalchemy import func,extract
print( session.query(User.password,func.count(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.count(User.id)).group_by(User.password).having(func.count(User.id)>1).all() )
print( session.query(User.password,func.sum(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.max(User.id)).group_by(User.password).all() )
print( session.query(User.password,func.min(User.id)).group_by(User.password).all() )
#使用extract提取时间中的分钟或者天来分组
print( session.query(extract('minute', User.creatime).label('minute'),func.count('*').label('count')).group_by('minute').all() )
print( session.query(extract('day', User.creatime).label('day'),func.count('*').label('count')).group_by('day').all() )

这里只是告诉大家的用法,其中group_by是分组,如果要使用聚合函数,就必须导入func,label是取别名的意思 。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章