SQLAlchemy中的Query方法

在SQLAlchemy中执行查询是通过session对象的query方法完成的。query方法非常灵活,你可以根据需要使用不同的查询方式查找数据,下面一一举例。
1.直接通过映射类查找:

#Querying user instance
for instance insession.query(User).order_by(User.id):
  print instance.name,instance.fullname

这种方法只要在query方法中,将映射类作为参数,就可以查询出这个映射类代表的数据库表中的数据。其相当于下面的SQL语句:

SELECTusers.id ASusers_id, users.name ASusers_name,
users.fullname ASusers_fullname, users.password ASusers_password
FROM users ORDERBY users.id

2.通过映射类的属性字段查询:

#Querying by ORM-instrument
for name,fullnamein session.query(User.name,User.fullname):
  print name,fullname

这种方法指定了查询的具体字段,而不是像第一种方法那样把映射类的所有字段都查询出来,其相当于执行了下面的SQL语句:

SELECTusers.name ASusers_name, users.fullname ASusers_fullname
FROM users

3.query查询的结果是保存在一个元组中的,所以我们可以在query中指定返回整个的映射类对象和其中的部分属性字段:

#Querying as a Python object
for row insession.query(User,User.name).all():
  print row.User,row.name

这种查询方法可以返回一个User对象以及它的name属性字段的值,其相当于执行了下面的SQL语句:

SELECTusers.id ASusers_id, users.name ASusers_name, users.fullname ASusers_fullname, users.password ASusers_password
FROM users

其输出结果为一个元组和一个字符串:

<</span>user("ed","Ed Jones","f8x902")> ed
<</span>user("Wendy","Wendy Williams","foobar")> Wendy
<</span>user("Marry","Marry Contrary","xxg527")> Marry
<</span>user("Fred","Fred Flinstone","blah")> Fred

4.我们还可以给返回的结果起一个别名,或者叫标签:

#Querying labeled
for row insession.query(User.name.label(‘name_label‘)).all():
  print (row.name_label)

这里的关键是label方法,它的意思是把User的name字段改个名字叫name_label,其相当于执行以下的SQL语句:

SELECTusers.name ASname_label
FROM users

6.除了给映射类字段起别名,我们还可以给映射类起个别名:

#Querying with aliased
from sqlalchemy.orm import aliased
user_alias=aliased(User,name=‘user_alias‘)
for row insession.query(user_alias,user_alias.name).all():
  print row.user_alias

这里要注意的是,我们引入了aliased函数,并且给User映射类起了个别名叫user_alias。然后我们就可以在query中使用这个别名了,它相当于是User对象。上面的代码相当于执行了以下SQL语句:

SELECTuser_alias.id ASuser_alias_id, user_alias.name ASuser_alias_name,
user_alias.fullname AS user_alias_fullname,user_alias.password AS user_alias_password
FROM users ASuser_alias

7.由于query的查询返回的是一个元组,所以我们可以利用Python对数组类对象进行“分片”的操作,来限制返回的结果集范围:

#Querying with limit and offset
for u insession.query(User).order_by(User.id)[1:3]:
  print u

这里我们对返回的结果加上了[1:3],来限制返回的结果集范围。其执行相当于下面的SQL语句:

SELECTusers.id ASusers_id, users.name ASusers_name,
users.fullname ASusers_fullname, users.password ASusers_password
FROM users ORDERBY users.id
 LIMIT ? OFFSET ?

8.前面的查询都没有涉及到子查询,也就是SQL的where子句。在SQLAlchemy框架中,query的子查询可以通过filter_by来实现:

#Qyering with filter by
for name,in session.query(User.name).filter_by(fullname=‘Ed Jones‘):
  print name

上面的查询相当于要找出User映射表中fullname为’Ed Jones’的数据,其相当于执行了下面的SQL语句:

SELECTusers.name ASusers_name
FROM users
WHERE users.fullname = ?

9.除了filter_by之外,我们还可以使用filter方法,这种方式看起来更灵活,我们可以按照映射类对象的属性来指定查询条件:

#Querying with filter
for name,in session.query(User.name).filter(User.fullname==‘Ed Jones‘):
  print name

其参数与filter_by不同,这里使用了映射类名加属性字段的方式来指定查询子句参数,其相当于执行了下面的SQL语句:

SELECTusers.name ASusers_name
FROM users
WHERE users.fullname = ?

如果我们想要嵌套多个查询条件,可以嵌套多个filter:

#Querying with fully generative
for name,in session.query(User.name).filter(User.fullname==‘Ed Jones‘).filter(User.name==‘ed‘):
  print name

可以看到我们在filter方法后面又嵌套了一个filter,理论上可以嵌套无数个,其相当于执行了下面的SQL语句:

SELECTusers.name ASusers_name
FROM users
WHERE users.fullname = ? AND users.name = ?

完整的示例代码如下:

fromsqlalchemy.ext.declarative importdeclarative_base
from sqlalchemy import Column,Integer,String
from sqlalchemy import Sequence
from sqlalchemy.orm import sessionmaker
Base=declarative_base()
from sqlalchemy import create_engine
engine=create_engine(‘sqlite:///:memory:‘,echo=True)
class User(Base):
  __tablename__=‘users‘
  id=Column(Integer,Sequence(‘user_id_seq‘),primary_key=True)
  name=Column(String(50))
  fullname=Column(String(50))
  password=Column(String(12))
  def__init__(self,name,fullname,password):
    self.name=name
    self.fullname=fullname
    self.password=password

def__repr__(self):
    return ‘‘ %(self.name,self.fullname,self.password)
Base.metadata.create_all(engine)
Session=sessionmaker(bind=engine)
session=Session()
#Add on user
ed_user=User(‘ed‘,‘Ed Jones‘,‘edpassword‘)
session.add(ed_user)
#Retrive saved ed_user
our_user=session.query(User).filter_by(name=‘ed‘).first()
print ‘our_user is:‘,our_user
print ‘our_user id is:‘,our_user.id
print ‘our_user is ed_user‘,our_user==ed_user

#Add multiple object
session.add_all(
  [
    User(‘Wendy‘,‘Wendy Williams‘,‘foobar‘),
    User(‘Marry‘,‘Marry Contrary‘,‘xxg527‘),
    User(‘Fred‘,‘Fred Flinstone‘,‘blah‘)
  ]
)
#Detective the dirty data
ed_user.password=‘f8x902‘
print ‘Dirty data‘,session.dirty
#Detective the new data
print ‘New data‘,session.new
#Commit data
session.commit()
#========Querying===============
#Querying user instance
for instance insession.query(User).order_by(User.id):
  print instance.name,instance.fullname
#Querying by ORM-instrument
for name,fullnamein session.query(User.name,User.fullname):
  print name,fullname
#Querying as a Python object
for row insession.query(User,User.name).all():
  print row.User,row.name

#Querying labeled
for row insession.query(User.name.label(‘name_label‘)).all():
  print (row.name_label)
#Querying with aliased
from sqlalchemy.orm import aliased
user_alias=aliased(User,name=‘user_alias‘)
for row insession.query(user_alias,user_alias.name).all():
  print row.user_alias
#Querying with limit and offset
for u insession.query(User).order_by(User.id)[1:3]:
  print u
#Qyering with filter by
for name,in session.query(User.name).filter_by(fullname=‘Ed Jones‘):
  print name
#Querying with filter
for name,in session.query(User.name).filter(User.fullname==‘Ed Jones‘):
  print name
#Querying with fully generative
for name,in session.query(User.name).filter(User.fullname==‘Ed Jones‘).filter(User.name==‘ed‘):
  print name

Python标准函数库,SQLAlcehemy

时间: 2024-11-25 05:49:27

SQLAlchemy中的Query方法的相关文章

SQLAlchemy中Model.query和session.query(Model)的区别

我们使用Flask 0.11.1,Flask-SQLAlchemy 2.1使用PostgreSQL作为DBMS. 示例使用以下代码更新数据库中的数据: entry = Entry.query.get(1) entry.name = 'New name' db.session.commit() 从Flask shell执行时,这完全正常,因此数据库已正确配置.现在,我们的控制器用于更新条目,略微简化(没有验证和其他样板),如下所示: def details(id): entry = Entry.q

PDO 学习与使用 ( 一 ) :PDO 对象、exec 方法、query 方法与防 SQL 注入

1.安装 PDO 数据库抽象层 PDO - PHP Data Object 扩展类库为 PHP 访问数据库定义了一个轻量级的.一致性的接口,它提供了一个数据访问抽象层,针对不同的数据库服务器使用特定的 PDO 驱动程序访问,如图: Windows 环境下 PHP 5.1 以上版本通过编辑 php.ini文件来安装 PDO:去掉 extension=php_pdo.dll 前面的 ; 如果使用的数据库是 MySQL ,在 php.ini 文件中加载 MySQL 的 PDO 驱动: 添加 exten

cakephp 的query方法,直接写在controller中是否 有点不合适

模型的query()函数有时是非常实用的,它可以在任何需要数据的地方执行SQL语句.但不是在什么地方调用query()方法都是恰当的.特别是在控制器中直接调用模型的query()方法 $this->MyModel->query('Here comes the SQL statement'); 在控制器中调用模型的query方法么有什么不可以,但它引入了数据库相关的代码,这违反了MVC模式的原则 一个更加干净的方案是把SQL语句移动到模型中,因此上面那段代码重构为: // 在模型中functio

关于DButils中的query(Connection conn, String sql, ResultSetHandler&lt;T&gt; rsh)方法使用的解释

首先介绍该方法的功能,就是实现数据库查询功能,并返回某个封装的对象,参数conn是数据库的连接对象,参数sql是查询的sql语句,参数rsh是用来约束返回的对象. 这是query(Connection conn, String sql, ResultSetHandler<T> rsh)方法的源代码: public <T> T query(Connection conn, String sql, ResultSetHandler<T> rsh) throws SQLExc

flask SQLAlchemy中一对多的关系实现

SQLAlchemy是Python中比较优秀的orm框架,在SQLAlchemy中定义了多种数据库表的对应关系, 其中一对多是一种比较常见的关系.利用flask sqlalchemy实现一对多的关系如下: 1. 建立数据库的模型 在本次试验中建立三个表: user, phone ,atttr.user 和phone, phone 和atttr均为一对多的关系.实现如下: #!/usr/bin/env python # -*- coding: utf-8 -*- from flask import

SqlAlchemy 中操作数据库时session和scoped_session的区别

原生session: from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine from sqlalchemy应用.models import Users engine = create_engine( "mysql+pymysql://root:[email protected]:3306/pro6?charset=utf8", max_overflow=0, # 超过连接池大小外最多创建

SQLAlchemy 中的 Session、sessionmaker、scoped_session

目录 一.关于 Session 1. Session是缓存吗? 2. Session作用: 3. Session生命周期: 4. Session什么时候创建,提交,关闭? 4. 获取一个Session: 5. 关于SQLAlchemy 的 create_engine: 6. 关于线程安全: 二.单线程下 scoped_session 对创建 Session 的影响 1. 两个 Session 添加同一个对象 2. 不同的 Session 添加不同的对象 3. 用 scoped_session 创

mysql中slow query log慢日志查询分析

在mysql中slow query log是一个非常重要的功能,我们可以开启mysql的slow query log功能,这样就可以分析每条sql执行的状态与性能从而进行优化了. 一.慢查询日志 配置 开启慢查询日志 , 配置样例: /etc/mysql/my.cnf[mysqld]log-slow-queries 在 my.cnf 配置文件中增加上述配置项并重启 mysql 服务,这时 mysql 慢查询功能生效.慢查询 日志将写入参数 DATADIR (数据目录:/var/lib/mysql

IQueryable 查询语句中 OrderByDescending() 扩展方法使用注意点

目的: 查询结构物下所有网关的最新诊断结果. 1. 正确查询 (按诊断时间倒序) var query = queryDiag.GroupBy(g => new {g.dtuId, g.dtuNo, g.dtuDesp}) .Select(s => s.GroupBy(r => r.diagTime) .Select(e => new { s.Key.dtuId, s.Key.dtuNo, s.Key.dtuDesp, diagTime = e.Key, cpuRatio = e.W