一:对象关系教程查询

  一个 Query创建对象时使用 Session的query()方法 。此函数接受一个变量数量的参数,可以是任何类和class-instrumented描述符的组合。

  Query返回的是元组,可以像普通Python对象一样,元组返回一个属性的名字或者一个类的类名 

  1)Query它加载User实例

for instance in session.query(User).order_by(User.id):
print(instance.name,instance.fullname) ----------------------------------------------------------------
ed tianshi
shi shi jone
san san jone
jun jun jone

  2)ORM-instrumented描述符作为参数 

for name,fullname in session.query(User.name,User.fullname):
print(name,fullname)
----------------------------------------------------------------
ed tianshi
shi shi jone
san san jone
jun jun jone

  3)元组返回一个属性的名字或者一个类的类名

  

for row in session.query(User,User.name).all():
print(row.User,row.name)
----------------------------------------------------------
name:ed full name:tianshi password:123456 ed
name:shi full name:shi jone password:123456 shi
name:san full name:san jone password:123456 san
name:jun full name:jun jone password:123456 jun

  4) 通过label()返回属性列重命名

for row in session.query(User.name.label("new_name")).all():
print(row.new_name)
--------------------------------------------------------------------------
ed
shi
san
jun

  5)通过aliased()把实例重命名

  

from sqlalchemy.orm import aliased
user_alias=aliased(User,name="user_alias") #把类实例重命名为user_alias for row in session.query(user_alias,user_alias.name).all():
print(row.user_alias)
--------------------------------------
name:ed full name:tianshi password:123456
name:shi full name:shi jone password:123456
name:san full name:san jone password:123456
name:jun full name:jun jone password:123456

  6)Query包括可以使用limit和offset,最方便的使用Python数组切片

  

for u in session.query(User).order_by(User.id)[1:3]:
表示从第1条后面开始查询2条 不包括3
print(u.id)
-----------------------------------------
2
3

  7)query查询结果过滤filter_by()和filter()。filter可以支持更多查询条件,注意写法上不同。

  

#filter_by查询
for name, in session.query(User.name).filter_by(fullname="shi jun2"):
print(name)
#filter查询
for name,in session.query(User.name).filter(User.fullname=="shi jun2"):
print(name)
#filter复合查询,这里相当于and查询
for user in session.query(User).filter(User.name=='shi2').filter(User.fullname=='shi jun2'):
print(user) 结果:
shi2
shi2
User<name:shi2 fullname:shi jun2 password:123456>

二:filter常用操作

1) equals

query.filter(User.name == 'ed')

2) not equals

query.filter(User.name != 'ed')

3) LIKE 是区分大小写的

query.filter(User.name.like('%ed%'))

4) ILIKE 不区分大小写的

query.filter(User.name.ilike('%ed%'))

5) IN

query.filter(User.name.in_(['ed', 'wendy', 'jack']))

# works with query objects too:
query.filter(User.name.in_(
session.query(User.name).filter(User.name.like('%ed%'))
))

6) NOT IN

query.filter(~User.name.in_(['ed', 'wendy', 'jack']))

7) IS NULL

query.filter(User.name == None)
query.filter(User.name.is_(None))

8)IS NOT NULL

query.filter(User.name != None)
query.filter(User.name.isnot(None))

9) AND

# use and_()
from sqlalchemy import and_
query.filter(and_(User.name == 'ed', User.fullname == 'Ed Jones')) # or send multiple expressions to .filter()
query.filter(User.name == 'ed', User.fullname == 'Ed Jones') # or chain multiple filter().filter_by() calls
query.filter(User.name == 'ed').filter(User.fullname == 'Ed Jones')

10) OR

from sqlalchemy import or_
query.filter(or_(User.name == 'ed', User.name == 'wendy'))

11)MATCH

match()使用一个特定于数据库的 MATCH或 CONTAINS函数;它的行为会有所不同后端和不可用等后端SQLite。
query.filter(User.name.match('wendy'))

三:返回结果

  Query发出SQL语句和返回包括数据库结果一个值

  

print(session.query(User.name).filter(User.fullname=="shi jun2"))
--------------------------------------------
SELECT users.name AS users_name
FROM users
WHERE users.fullname = %(fullname_1)s

   1)all()取出所的记录

  2)first()返回第一条记录

  3)one():不存在,或者有多行记录的时候报错(no items found,multiple items found

  4)one_or_none():如果有一条记录就返回一条记录,如果没有记录就返回NONE

  5)scalar()调用 one()方法,成功返回只有一行结果的第1列

  

query=session.query(User.name).first()
print(query)
('shi',)
query=session.query(User.name).all()
print(query)
[('shi',), ('shi2',)]
query=session.query(User.name).one()
print(query) sqlalchemy.orm.exc.MultipleResultsFound: Multiple rows were found for one() query=session.query(User.name).filter(User.name=="shi").one()#这里查询出的结果只有1条,所以不会报错
print(query)
('shi',)
如果有一条记录就返回一条记录,如果没有记录就返回NONE
query=session.query(User.name).filter(User.name=="shi").one_or_none()
('shi',)
print(query)
query=session.query(User.name).filter(User.name=="sh3").one_or_none()
print(query)
None query=session.query(User.name).filter(User.name=="shi").scalar()
print(query)
shi

四:Query通过text()可以使用字符串

# for user in session.query(User).filter(text("id<224")).order_by(text("id")).all():
# print(user) #通过params传递参数,使用:来分开参数 # for user in session.query(User).filter(text("id>:value and name=:name")).params(value=1,name="fred").order_by(User.id).one():
# print(user) for user in session.query(User).from_statement(text("select * from users where name=:name")).params(name="shi").all():
print(user)

五:count()方法用于确定SQL语句将返回多少行

print(session.query(User).filter(User.name.like("shi%")).count())
使用func.count()统计 from sqlalchemy import func
for row in session.query(func.count(User.name),User.name).group_by(User.name).all():
print(row)
------------
(1, 'shi')
(1, 'shi2') select count(*) from table
==session.query(func.count('*')).select_from(User).scalar()

SQLAlchemy-对象关系教程ORM-query的更多相关文章

  1. Object Relational Tutorial 对象关系教程

    The SQLAlchemy Object Relational Mapper presents a method of associating user-defined Python classes ...

  2. Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

    Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的, ...

  3. 对象关系映射ORM

    对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效 ...

  4. Django 源码小剖: Django 对象关系映射(ORM)

    引 从前面已经知道, 一个 request 的到来和一个对应 response 的返回的流程, 数据处理和数据库离不开. 我们也经常在 views.py 的函数定义中与数据库打交道. django O ...

  5. Python 3 对象关系映射(ORM)

    ORM 对象关系映射 Object Relational Mapping 表 ---> 类 字段 ---> 属性 记录 ---> 对象 # mysql_client.py impor ...

  6. 通过java反射实现简单的关于MongoDB的对象关系映射(ORM).

    通过阅读MongoDB  3.2.1的官方文档中关于java 编程发现最新的文档并没有实现对对象到Document的映射,所以自己有了利用反射实现简单的关系映射. 1.定义抽象类:AbstractMo ...

  7. 对象-关系映射ORM(Object Relational Mapping)(转)

    ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现 Hibernate在实现ORM功能的时候主要用到的文件有:映射类(*.java).映射文件(*.hbm.xml)和数据库配置文件 ...

  8. 对象关系映射 ORM

    1.1 作用 MTV框架中包括一个重要的部分,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因 ...

  9. 对象关系映射(ORM)框架GreenDao简介和基本使用

    官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. GreenDao特点 性能最大化,可能是Android平台上最快的ORM框架 易于使用的A ...

  10. Python学习---django之ORM语法[对象关系映射]180124

    ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...

随机推荐

  1. Container With Most Water - LeetCode

    目录 题目链接 注意点 解法 小结 题目链接 Container With Most Water - LeetCode 注意点 没什么好注意的... 解法 解法一:暴力求解,假设任意两个端点会是最佳答 ...

  2. 【洛谷P4706】取石子

    Description ​ 现在 Yopilla 和 yww 要开始玩游戏! ​ 他们在一条直线上标记了 \(n\) 个点,从左往右依次标号为 \(1, 2, ..., n\) .然后在每个点上放置一 ...

  3. iptables之NAT代理-内网访问外网

    1.前言 本文使用NAT功能:内网服务器,想上网又不想被攻击. 工作原理:内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做 ...

  4. Redis中国用户组|唯品会Redis cluster大规模生产实践

    嘉宾:陈群 很高兴有机会在Redis中国用户组给大家分享redis cluster的生产实践.目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作 Outline 一.生 ...

  5. C++ 实现vector<std:string> 版本

    #include <iostream> #include <vector> #include <memory> #include <thread> #i ...

  6. Java入门:使用Java API

    什么是Java类库 在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码.比如文件操作,不同程序对文件的操作基本都是一样的,打开文件,关闭文件,读取文件里面的 ...

  7. tensorflow变量作用域(variable scope)

    举例说明 TensorFlow中的变量一般就是模型的参数.当模型复杂的时候共享变量会无比复杂. 官网给了一个case,当创建两层卷积的过滤器时,每输入一次图片就会创建一次过滤器对应的变量,但是我们希望 ...

  8. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  9. 我的Pycharm,我做主

    之间花了一周多的时间把Pycharm官方帮助文档翻译了一遍,一共43篇博客,累得要屎,感悟颇多. 发牢骚之前先总结点干货,这里把所有的翻译文档列成如下目录,方便大家索引: 最全Pycharm教程(1) ...

  10. ReactiveCocoa内存管理

    1.我们创建的管道是如何被保存的么? ReactiveCocoa设计的目的之一是允许这样一种编程样式,即管道可以匿名创建.到目前为止,我们的管道都是这么处理的.为了支持这种模式,ReactiveCoc ...