http://jzqt.github.io/2015/12/29/SQLAlchemy%E7%AC%94%E8%AE%B0/
用SQLAlchemy做ORM也有一段時間了,總結一下用過的一些地方。
連接配接資料庫
SQLAlchemy通過一個url連接配接資料庫,這個url包含了連接配接資料庫相關的資訊。
資料庫連接配接URL
以MySQL為例,url的格式是
mysql+{driver}://{username}:{password}@{host}:{port}/{name}
,
其中
driver
是Python的資料庫驅動,比如MySQL官方的資料庫驅動
mysql-connector-python
,
driver
是
mysqlconnector
;
username
是資料庫使用者名;
password
是密碼;
host
是資料庫主機;
port
是資料庫端口;
name
是資料庫名。
建立資料庫引擎,中繼資料以及會話等
| |
一個
Session
執行個體可以了解成一個資料庫連接配接,通過它來操作資料庫;
也可以将它了解成一個容器,各種對象的執行個體存儲在其中。
資料庫連接配接池
注意:以上的連接配接資料庫方式擷取資料庫連接配接是使用預設的資料庫連接配接池的,
如果不想使用資料庫連接配接池的話可以用以下方式建立資料庫引擎。
| |
操作資料庫
聲明映射
在資料庫中定義一個資料表對應在Python代碼中則是定義一個類(也就是通常所說的Model),要維持從類到表的關系,首先就要先聲明一個映射。
| |
然後就可以通過繼承
Base
類來定義映射到資料表中的類了。
注意:
declarative_base()
生成的類,該類的子類一般都必須與資料庫中的一張表對應,
如果想擴充這個基類,讓所有子類都能使用,可以用如下方法。
| |
定義資料表模型
現在嘗試建立一個簡單的資料表。
| |
Integer
,
String
,
Enum
等資料類型都是SQLAlchemy定義的,會根據使用的資料庫不同而使用資料庫中對應的類型,
你也可以使用特定資料庫的特定類型,以MySQL為例。
| |
建立和删除資料表
上面的代碼隻是聲明這麼一個類
Student
映射資料表
tb_student
,建立資料表的操作需要如下代碼。
| |
删除資料表也是一樣的操作,值得一提的是,未在代碼中定義的資料表和不存在的資料表是不會做删除操作的。
| |
資料狀态
以ORM方式來對資料庫中的資料做增删查改操作是通過
Session
執行個體來完成的,
在學習了解如何以ORM方式操作資料之前首先我們要對資料的狀态有個基本的了解。
首先在ORM中,資料庫中的資料表對應于Python中的類,而資料表中的記錄對應于類的執行個體對象。
是以,對資料表中的記錄進行增删查改在Python中實際上就是對執行個體對象的操作。
資料執行個體對象有四種狀态,分别是
-
Transient - (瞬時的)
表示該執行個體對象不在session中,當然也沒有儲存到資料庫中,
主鍵一般情況下為
(如果一個Persistent狀态的對象進行事務復原後雖然主鍵有值,但卻是Transient狀态)。None
-
Pending - (挂起的)
調用
後,Transient狀态的對象就會變成Pending狀态的對象,這個時候它隻是在session.add()
session
中,
并沒有儲存到資料庫,是以主鍵依舊為
None
。
隻有觸發了
操作才會儲存到資料庫使得主鍵有值,比如查詢操作就會觸發flush。session.flush()
- Persistent - (持久的)
和資料庫中都有對應的記錄存在,為持久狀态。session
-
Detached - (遊離的)
資料庫中可能有記錄,但是
中不存在。對這種對象的操作不會觸發任何SQL語句。session
要檢視資料對象的狀态可以用如下方式
| |
SQLAlchemy關于資料執行個體對象狀态的官方文檔
資料的簡單操作
以下面的資料表為例。
| |
用
session
來表示資料庫會話執行個體。
查詢操作
查詢子句使用
session
的
.query()
方法來擷取
Query
查詢對象。
查詢對象能夠使用一些方法來對應一些查詢子句,比如
.order_by()
,
.limit()
,
.filter()
等,進階的查詢後面會專門講。
查詢對象有這麼幾種方法
.one()
,
.all()
,
.scalar()
,
.one_or_none()
,
.get()
,以及
.first()
等。
下面對這幾個方法的用法及效果做簡單解釋。
-
.all()
傳回查詢到的所有的結果。
這個方法比較危險的地方是,如果資料量大且沒有使用
limit
子句限制的話,所有的結果都會加載到記憶體中。
它傳回的是一個清單,如果查詢不到任何結果,傳回的是空清單。
-
傳回查詢到的第一個結果,如果沒有查詢到結果,傳回.first()
。None
-
這個方法與.scalar()
.one_or_none()
的效果一樣。
如果查詢到很多結果,抛出
sqlalchemy.orm.exc.MultipleResultsFound
異常。
如果隻有一個結果,傳回它,沒有結果傳回
。None
-
.one()
如果隻能查詢到一個結果,傳回它,否則抛出異常。
沒有結果時抛
,有超過一個結果時抛sqlalchemy.orm.exc.NoResultFound
。sqlalchemy.orm.exc.MultipleResultsFound
-
比起.one_or_none()
來,差別隻是查詢不到任何結果時不再抛出異常而是傳回.one()
。None
-
.get()
這是個比較特殊的方法。它用于根據主鍵來傳回查詢結果,是以它有個參數就是要查詢的對象的主鍵。
如果沒有該主鍵的結果傳回
,否則傳回這個結果。None
代碼示例
| |
增加操作
删除操作
修改操作
轉載于:https://www.cnblogs.com/fengff/p/9324660.html