Python SQLAlchemy --2
本文為 Python SQLAlchemy ORM 一系列教學文:
接下來會更深入地探討查詢的使用。
查詢的基本使用法為 session.query(Mapped Class),其後可加 .group_by(), .order_by(), .delete 等方法。
只是要注意的是 query() 接受的參數為 Mapped Class (例如先前定義的 User 類別),而不是表格名稱。
例如在 範例 2 中是以 User 做為參數,而不是以 user 這個表格名稱做為參數。
如果查詢成功就會回傳 Query Object,若無則會回傳 None 。
首先,query() 可以使用 from_statement() 方法,直接以完整的 SQL 指令進行查詢,更可以搭配 params() 將變數代入 SQL 指令中。
例如:
1 |
rows = session.query(User).from_statement('SELECT * FROM user WHERE name=:name').params(name='user1')
|
其中,上述 SQL 指令中的 :name 代表會有一個參數名 name ,然後在 params(name='user1') 中就指明了 name 的值為 user1 。
基本上這樣就能夠進行大多數的查詢,但若希望能夠更深入地學會運用 SQLAlchemy 進行查詢,就可以閱讀以下的文章。
以下是幾個關於 query() 的使用範例(由於 User 類別已在先前已經定義過了,因此以下範例會直接省略)。
SELECT
範例的 SQL 指令 ─ SELECT * FROM user
1 |
for r in session.query(User): |
執行結果如下:
1 |
[class main__.user] |
上述的範例程式碼,是列出每一列 SELECT 查詢出來的結果,可以注意到的是每一列的 r 都是一個 User 實例,因此我們就可以依照先前定義 User 類別的欄位屬性,將這些屬性列印出來。
SELECT user.name FROM user query() 也能針對個別欄位進行 SELECT ,只要將 Mapped Class 及其屬性做為參數即可,例如只想查詢全部的 username ,那麼 query() 的參數就會是 User.username 。
1 |
for r in session.query(User.username): |
執行結果如下:
1 |
[class sqlalchemy.util._collections.keyedtuple] |
此處值得注意的是,當有只針對個別欄位 SELECT 的情況時,就是回傳 KeyedTuple 實例了,而不是我們先前的定義的 User 類別的實例。
WHERE
範例 SQL 指令 ─ SELECT * FROM user WHER id = 1
若要使用 WHERE 條件查詢,則是使用 filter_by() 或 filter() 方法。
兩者的差異在於 filter_by() 必須使用屬性名稱做為參數名稱,然後加上查詢條件。例如查詢 id 為 1 的資料為 filter_by(id=1)。\
而 filter() 則是以 Mapped Class 及其屬性加上查詢條件做為參數,而且支援 Python 運算子。例如同樣查詢 id 為 1 的資料為 filter(User.id == 1) 。
不過,SQLAlchemy 其實也有提供 filter() 以字串為參數的用法,例如查詢 id 為 1 也可以表示成為 filter(id=1) 。
此外,多個查詢條件可以用附加 .filter(…) 的形式達成。
1 |
for r in session.query(User.id).filter_by(id=1): |
更多的查詢條件可以看 Common Filter Operators ,如 LIKE, IN, NOT IN 等等。
ORDER BY
範例 SQL 指令 ─ SELECT user.id FROM user ORDER BY user.id DESC
排序可以使用 order_by() ,參數為 Mapped Class 及其屬性。例如想依照 id 欄位排序,那麼參數就會是 User.id 。此外, 預設的排序為遞增排序 。
遞減排序的部份則要記得 import desc 模組:
1 |
from sqlalchemy import desc |
以下範例示範遞增及遞減排序:
1 |
# 遞減 |
LIMIT
有時會需要使用 LIMIT 來限制查詢的範圍,例如分頁功能,最直接的方法就是用 Python slice 的功能,SQLAlchemy 就會自動將 LIMIT 的查詢條件附加到查詢的 SQL 語法後面。
範例:
1 |
for row in session.query(User)[500:520]: |
如上述加上 [500:520] ,就能夠看到 SQLAlchemy 的查詢指令多了 LIMIT ? OFFSET ? 的訊息。
其中 520 減 500 的數值為 LIMIT 的數值,限制 20 筆;而 500 為 OFFSET 從第 500 筆資料開始查詢。
GROUP BY
範例 SQL 指令 ─ SELECT * FROM user GROUP BY user.name
如果要使用 GROUP BY,則是使用 group_by() 。
1 |
for r in session.query(User).group_by(User.name): |
HAVING
範例 SQL 指令 ─ SELECT user.name FROM user GROUP BY user.name HAVING count(user.id) > 2
與 GROUP BY 常一起使用的通常會有 HAVING , COUNT() , SUM() , MAX() … 等語法。
在 SQLAlchemy 中 HAVING 是接在 group_by() 後的 having()方法,而 COUNT(), SUM(), MAX() 等函數則是由 SQLAlchemy 的 func 模組所實作,因此要使用 COUNT() , SUM() , MAX() 等函數須先 import func 模組。
1 |
from sqlalchemy import func |
以下是結合 HAVING 及 COUNT() 的範例,用來列印出資料表內相同名字大於 2 個以上使用者名稱:
1 |
for row in session.query(User).group_by(User.name).having(func.count(User.id) > 2): |
Alias(AS)
範例 SQL 指令 ─ SELECT u.id FROM user AS u
表格的 AS 別名用法是使用 aliasd() 方法,可以將 Mapped Class 及表格名稱以別名進行查詢。
此一方法需要 import aliasd 模組。
1 |
from sqlalchemy.orm import aliased |
表格名稱別名範例:
1 |
user_alias = aliased(User, name='user_alias') |
如果成功,應該會看到 SELECT 的過程多了FROM user AS user_alias 的訊息出現,如下所示。
1 |
2013-08-25 11:52:45,177 INFO sqlalchemy.engine.base.Engine SELECT user_alias.id AS user_alias_id, user_alias.name AS user_alias_name, user_alias.username AS user_alias_username, user_alias.password AS user_alias_password |
此外,欄位名稱也能夠使用 AS 的 SQL 語法,不過在 SQLAlchemy 中則是用 label() 來命名。
範例如下:
1 |
for row in session.query(User.name.label('n')):
|
計算查詢結果筆數
如要計算查詢結果筆數,使用 count() 即可。
例如:
1 |
print( |
注意:此處的 count() 與 func.count() 不同
first, scalar(), one(), all()
除了查詢結果筆數之外,SQLAlchemy 也提供了一些方便的方法確認查詢結果或回傳查詢結果。
first() 只回傳第一筆結果,即使有多筆結果也只會回傳第一筆
scalar() 只回傳第一筆結果,查無結果則回傳 None ,若有查詢有多筆結果則會產生例外錯誤
scalar() 範例如下:
1 |
try: |
one() 回傳一筆結果,如有多筆或查無結果的情況則會產生例外錯誤
one() 範例:
1 |
try: |
all() 將所有結果匯出成一個 list 回傳
all() 範例:
1 |
allres = session.query(User).all() |
參考資料:
Python SQLAlchemy --2的更多相关文章
- python SQLAlchemy
这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...
- Python SQLAlchemy --3
本文為 Python SQLAlchemy ORM 一系列教學文: 刪除 學會如何查詢之後,就能夠進行後續的刪除.更新等操作. 同樣地,以幾個範例做為學習的捷徑. 123456789 user_1 = ...
- Python SQLAlchemy --1
本文為 Python SQLAlchemy ORM 一系列教學文: SQLAlchemy 大概是目前 Python 最完整的資料庫操作的套件了,不過最令人垢病的是它的文件真的很難閱讀,如果不搭配個實例 ...
- Python SqlAlchemy使用方法
1.初始化连接 from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker engine = create ...
- python+SQLAlchemy+爬虫
python+SQLAlchemy+爬虫 前面分享了SQLAlchemy的知识,这次我共享一下学习用python开发爬虫再把爬出来的数据放到用SQLAlchemy的数据库上面的知识,当然我这个是带测试 ...
- Python.SQLAlchemy.0
1. SQLAlchemy and You http://lucumr.pocoo.org/2011/7/19/sqlachemy-and-you/ 2. Overview http://docs.s ...
- Python SQLAlchemy基本操作和常用技巧包含大量实例,非常好python
http://www.makaidong.com/%E8%84%9A%E6%9C%AC%E4%B9%8B%E5%AE%B6/28053.shtml "Python SQLAlchemy基本操 ...
- Python SQLAlchemy入门教程
本文将以Mysql举例,介绍sqlalchemy的基本用法.其中,Python版本为2.7,sqlalchemy版本为1.1.6. 一. 介绍 SQLAlchemy是Python中最有名的ORM工具. ...
- Python—sqlalchemy
SQLAlchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作. #Dialect用于和数据API进行交流,根据配置文 ...
随机推荐
- Metro Win8风格的按钮(Filp翻转)
原地址->http://www.cnblogs.com/yk250/p/5661093.html 介绍:简约而不简单....颜色可随意调制,最好用Blend工具. 效果图如下:话说这个图会不会太 ...
- E1、T1链路
北美的24路脉码调制PCM简称T1 速率是1.544Mbit/s 北美使用的T1系统共有24个话路,每个话路采样脉冲用7bit编码,然后再加上1位信令码元,因此一个话路占用8bit. 帧同步码是在24 ...
- iOS 为iPhone和iPad创建不同的storyboard
复制Main.storyboard,重命名为Main_iPad.storyboard 在info.plist文件中添加 Main storyboard file base name (iPad) -- ...
- OnNcCalcSize改变标题栏等的高度
在创建窗口时,当收到 WM_NCCALCSIZE 消息时才指定客户区.不管什么时候,只要 Windows 想知道窗口客户区的大小,它便会发送这个消息. NCCALCSIZE_PARAMS 结构保存三个 ...
- 这些年正Android - 大学
还记得,第一次看见小周是在大一的操场上. 她正向教学楼站着,一身白配粉的休闲上衣搭配湖蓝色的牛仔裤,穿着一双很平凡的凉鞋,手里拿着当年的Nokia 3110c,皙清的手指,素颜的站着不言不笑.现在回 ...
- 基于mini2440的Tslib的移植
软件平台: win7系统,虚拟机ubuntu12.04 mini2440开发板 tslib是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波.去抖.校准等功能 ...
- Macbook下virtualenv无法使用解决办法
Mac下删除自己安装的Python 删除Python框架sudo rm -rf /Library/Frameworks/Python.framework/Versions 删除Python程序sudo ...
- IP验证正则表达式
Regex r = new Regex(@"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$" ...
- XML文件中CDATA的作用
操作XML文件时,如果允许用户输入内容,例如∶"< ".">"."/".""等,当生成XML时,会破坏了XM ...
- Activity has leaked window that was originally added
错误: E/WindowManager: android.view.WindowLeaked: Activity com.x.x.x has leaked window com.android.int ...