- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python的ORM框架中SQLAlchemy库的查询操作的教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1. 返回列表和标量(Scalar) 。
前面我们注意到Query对象可以返回可迭代的值(iterator value),然后我们可以通过for in来查询。不过Query对象的all()、one()以及first()方法将返回非迭代值(non-iterator value),比如说all()返回的是一个列表:
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> query
=
session.query(User).\
>>>
filter
(User.name.like(
'%ed'
)).order_by(User.
id
)
>>> query.
all
()
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE users.name LIKE ? ORDER BY users.
id
(
'%ed'
,)
[User(
'ed'
,
'Ed Jones'
,
'f8s7ccs'
), User(
'fred'
,
'Fred Flinstone'
,
'blah'
)]
|
first()方法限制并仅作为标量返回结果集的第一条记录:
1
2
3
4
5
6
7
8
9
10
11
|
>>> query.first()
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE users.name LIKE ? ORDER BY users.
id
LIMIT ? OFFSET ?
(
'%ed'
,
1
,
0
)
<User(
'ed'
,
'Ed Jones'
,
'f8s7ccs'
)>
|
one()方法,完整的提取所有的记录行,并且如果没有明确的一条记录行(没有找到这条记录)或者结果中存在多条记录行,将会引发错误异常NoResultFound或者MultipleResultsFound:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
>>>
from
sqlalchemy.orm.exc
import
MultipleResultsFound
>>>
try
:
... user
=
query.one()
...
except
MultipleResultsFound, e:
...
print
e
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE users.name LIKE ? ORDER BY users.
id
(
'%ed'
,)
Multiple rows were found
for
one()
>>>
from
sqlalchemy.orm.exc
import
NoResultFound
>>>
try
:
... user
=
query.
filter
(User.
id
=
=
99
).one()
...
except
NoResultFound, e:
...
print
e
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE users.name LIKE ? AND users.
id
=
? ORDER BY users.
id
(
'%ed'
,
99
)
No row was found
for
one()
|
2. 使用原义SQL (Literal SQL) 。
Query对象能够灵活的使用原义SQL查询字符串作为查询参数,比如我们之前用过的filter()和order_by()方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
>>>
for
user
in
session.query(User).\
...
filter
(
"id<224"
).\
... order_by(
"id"
).
all
():
...
print
user.name
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE
id
<
224
ORDER BY
id
()
ed
wendy
mary
fred
|
当然很多人可能会和我感觉一样,会有些不适应,因为使用ORM就是为了摆脱SQL语句的,没想到现在又看到SQL的影子了。呵呵,SQLAlchemy也要照顾到使用上的灵活性嘛,毕竟有些查询语句直接编入要容易得多.
当然绑定参数也可以用基于字符串的SQL指派,使用冒号来标记替代参数,然后再使用params()方法指定相应的值:
1
2
3
4
5
6
7
8
|
>>> session.query(User).
filter
(
"id<:value and name=:name"
).\
... params(value
=
224
, name
=
'fred'
).order_by(User.
id
).one()
SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE
id
<User(
'fred'
,
'Fred Flinstone'
,
'blah'
)>
|
到这里,SQL语句的样子已经初见端倪了,其实我们可以更极端一点,直接使用SQL语句,什么?这样就失去ORM的价值了!别急,这里只是介绍一下支持这种用法,当然我建议不到万不得已,尽量不要这样写,因为可能会有兼容的问题,毕竟各个数据库的SQL方言不一样。不过有一点需要注意的是,如果要直接使用原生SQL语句,在被query()所查询的映射类中,你必须保证语句所指代的列仍然被映射类所管理,比如接下来的例子:
1
2
3
4
5
6
7
|
>>> session.query(User).from_statement(
...
"SELECT * FROM users where name=:name"
).\
... params(name
=
'ed'
).
all
()
SELECT
*
FROM users where name
=
?
(
'ed'
,)
[<User(
'ed'
,
'Ed Jones'
,
'f8s7ccs'
)>]
|
我们还可以在query()中直接使用列名来指派我们想要的列而摆脱映射类的束缚:
1
2
3
4
5
6
7
8
|
>>> session.query(
"id"
,
"name"
,
"thenumber12"
).\
... from_statement(
"SELECT id, name, 12 as "
...
"thenumber12 FROM users where name=:name"
).\
... params(name
=
'ed'
).
all
()
SELECT
id
, name,
12
as thenumber12 FROM users where name
=
?
(
'ed'
,)
[(
1
, u
'ed'
,
12
)]
|
3. 计数 (Counting) 。
对于Query来说,计数功能也有个单独的方法称为count():
1
2
3
4
5
6
7
8
9
10
11
|
>>> session.query(User).
filter
(User.name.like(
'%ed'
)).count()
SELECT count(
*
) AS count_1
FROM (SELECT users.
id
AS users_id,
users.name AS users_name,
users.fullname AS users_fullname,
users.password AS users_password
FROM users
WHERE users.name LIKE ?) AS anon_1
(
'%ed'
,)
2
|
count()方法被用于确定返回的结果集中有多少行,让我们观察一下产生的SQL语句,SQLAlchemy先是取出符合条件的所有行集合,然后再通过SELECT count(*)来统计有多少行。当然有点SQL知识的同学可能知道这条语句可以以更精简的方式写出来,比如SELECT count(*) FROM table,当然现代版本的SQLAlchemy不会去揣摩这样的想法.
假使我们要让查询语句更加精炼或者要明确要统计的列,我们可以通过表达式func.count()直接使用count函数,比如下面的例子介绍统计并返回每个唯一的用户名字:
1
2
3
4
5
6
7
|
>>>
from
sqlalchemy
import
func
>>> session.query(func.count(User.name), User.name).group_by(User.name).
all
()
SELECT count(users.name) AS count_1, users.name AS users_name
FROM users GROUP BY users.name
()
[(
1
, u
'ed'
), (
1
, u
'fred'
), (
1
, u
'mary'
), (
1
, u
'wendy'
)]
|
对于刚才提到的简单SELECT count(*) FROM table语句,我们可以通过下面的例子来实现:
1
2
3
4
5
6
|
>>> session.query(func.count(
'*'
)).select_from(User).scalar()
SELECT count(?) AS count_1
FROM users
(
'*'
,)
4
|
当然如果我们直接统计User的主键,上面的语句可以更加简练,我们可以省去select_from()方法:
1
2
3
4
5
6
|
>>> session.query(func.count(User.
id
)).scalar()
SELECT count(users.
id
) AS count_1
FROM users
()
4
|
。
最后此篇关于Python的ORM框架中SQLAlchemy库的查询操作的教程的文章就讲到这里了,如果你想了解更多关于Python的ORM框架中SQLAlchemy库的查询操作的教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
Java 库和 android 库有什么区别,各自有什么优点/缺点? 最佳答案 您可以在 Android 应用程序中包含标准 Java .jar 文件库。它们在 .apk 构建时被翻译成 Dalvik
所以,我现在的代码就像从 Java 层加载库(比如 liba.so),并在内部 liba.so 加载 libb.so。因此,如果我必须将所有库打包到 APK 中并将其安装在没有 root 访问权限的设
我想在我的系统中设置 LEDA 库。 我已经从以下链接下载了 LEDA 库 http://www.algorithmic-solutions.info/free/d5.php Instruct
我想用 autoconf 创建一个共享库。但是,我希望共享库具有“.so”扩展名,而不是以“lib”开头。基本上,我想制作一个加载 dlopen 的插件。 .是否有捷径可寻? 当我尝试使用 autoc
我需要在 Apps 脚本应用程序上修改 PDF。为此,我想使用 JS 库:PDF-LIB 我的代码: eval(UrlFetchApp.fetch("https://unpkg.com/pdf-lib
我正在构建一个使用以下 Boost header 的程序(我使用的是 Microsoft Visual C++ 10), #include #include #include #include
当我通过 cygwin 在 hadoop 上运行此命令时: $bin/hadoop jar hadoop-examples-*.jar grep input output 'dfs[a-z.]+' 我
我已经通过 vcpgk 成功安装了一个 C++ 库,名为:lmdb:x64-windows 我还安装了lmdb通过 Cabal 安装的 Haskell 绑定(bind)包 在尝试测试 lmdb 包时:
我该如何解决这个问题? 我刚刚将 javacv jar 文件复制到我的项目 Lib 文件夹下,但出现了这个错误! 我可以找到这个thread来自谷歌,但不幸的是,由于我国的谷歌限制政策,该页面无法打开
我有一个 Android 库项目 FooLib。 FooLib 引用 Android Context 之类的东西,但不需要任何资源文件(res/ 中的东西)所以我目前将其打包为供我的应用使用的 JAR
我正在开发一个 Android 应用程序(使用 Android Studio),它能够通过手势识别算法了解您正在进行的 Activity 。对于我使用 nickgillian ithub 帐户上可用的
关于从 .NET Framework 项目中引用 .NET Standard 类库的问题有很多类似的问题,其中 netstandard 库中的 NuGet 包依赖项不会流向 netframework
我已经从互联网上下载了 jna-4.2.2.jar,现在想将这个 jar 导入到我的项目中。但是当我试图将这个 jar 导入我的项目时,出现以下错误。 [2016-06-20 09:35:01 - F
我正在尝试通过编译在 Mac 上安装 rsync 3.2.3。但是,我想安装所有功能。为此,它需要一些库,此处 ( https://download.samba.org/pub/rsync/INSTA
进入 Web 开发有点困难。过去 5 年我一直致力于 winforms 工作。所以我正在努力从一种切换到另一种。前段时间,我使用过 JavaScript,但现在还没有大量的 JavaScript 库
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在寻找一个用Python编写的与logstash(ruby + java)类似的工具/库。 我的目标是: 从 syslog 中解析所有系统日志 解析应用程序特定日志(apache、django、m
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我花了几天时间试图寻找用于 JavaPOS 实现的 .jar 库,但我找不到任何可以工作的东西。我找到了很多像这样的文档:http://jpos.1045706.n5.nabble.com/file/
这个问题在这里已经有了答案: Merge multiple .so shared libraries (2 个答案) 关闭 9 年前。 我有我在代码中使用的第三方库的源代码和对象。该库附带有关如何使
我是一名优秀的程序员,十分优秀!