一文入門:Flask要件之ORM架構SQLAlchemy

上期文中已經簡要介紹了一下flask在參數傳遞方面的基本知識,那麼本文就簡要的介紹一下flask的orm架構SQLAlchemy。

什麼是SQLAlcheymy

一文入門:Flask要件之ORM架構SQLAlchemy

SQLAlchemy是Python編程語言下的一款開源軟件。提供了SQL工具包及對象關係映射(ORM)工具,使用MIT許可證發行。SQLAlchemy“採用簡單的Python語言,為高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型”。SQLAlchemy的理念是,SQL數據庫的量級和性能重要於對象集合;而對象集合的抽象又重要於表和行。因此,SQLAlchemy採用了類似於Java裡Hibernate的數據映射模型,而不是其他ORM框架採用的Active Record模型。不過,Elixir和declarative等可選插件可以讓用戶使用聲明語法。SQLAlchemy首次發行於2006年2月,並迅速地在Python社區中最廣泛使用的ORM工具之一,不亞於Django的ORM框架

SQLAlchemy的基本使用

根據筆者對於SQLAlchemy的探究,SQLAlchemy的使用基本有以下幾個基本要點:

1. 環境的準備

既然SQLAlchemy是python下的一款開源軟件,那麼其使用也如其他的軟件模塊一樣,也是通過pip工具進行安裝,在安裝完成之後,直接import即可

#SQLAlchemy的安裝
pip install SQLAlchemy
#SQLAlchemy的引用
import SQLAlchemy

2. SQLAlcheymy的基本配置

那麼在編碼中如何進行數據庫鏈接的配置呢?這個問題紀就要結合編者的上幾篇文中的知識點一起結合使用,在flask的基本使用中,需要使用下文實例化一個flask變量,而數據庫的各類配置參數就通過字典元素賦值的方式進行設置,具體如下

app = flask() #實例化flask變量
app.config['SQLALCHEMY_DATABASE_URI'] = '數據庫類型://數據庫登錄名:數據庫登錄密碼@數據庫的地址:數據庫的端口/數據庫的名字'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True

在通過了參數設定後,在通過帶參實例化方法,創建一個SQLAlcheymy變量,如下:

db = SQLAlchemy(app)

根據不同的數據庫類型,那麼就可以有如下各種不同的數據庫連接參數設定:

postgresql://scott:tiger@localhost/mydatabase
mysql://scott:tiger@localhost/mydatabase
oracle://scott:[email protected]:1521/sidname
sqlite:////absolute/path/to/foo.db

3. 創建映射物理表的類

class Role(db.Model):
__tablename__ = "my_table" # 寫表名
id = db.Column(db.INTEGER,primary_key=True) # 這行不能刪
name = db.Column(db.String(10),nullable=False) # 這行也是

在使用SQLAlchemy時,一定要注意,不僅僅要連接到數據表,並且你的創建表的類也必須寫進來。而且字段和約束條件要吻合,不然會報錯的。那麼這裡主要的知識點是如下兩個:

  • __ tablename __ :用來定義類所映射的物理表的名稱
  • column:用來定義一個映射到數據庫表中的一個字段

4. SQLAlchemy框架下的數據插入

和其他的orm框架一樣,要完成數據的插入,首先要創建一個對象實例,比如這裡是:

r1 = Role(name="用戶1")

同理,可以創建多個

r1 = Role(name="用戶1")
r2 = Role(name="用戶2")

r3 = Role(name="用戶3")

那麼如何完成數據庫的插入呢,實例如下:

db.session.add(r1) #增加一條記錄
db.session.commit()
db.session.add_all([r2,r3]) #增加多行記錄
db.session.commit()

5. SQLAlchemy框架下的數據刪除

進行數據的刪除,首先需要進行行定位:

user = User.query.first()
db.session.delete(user)
db.session.commit()

或者

User.query.first().delete()
db.session.commit()

6. SQLAlchemy框架下的數據更新

更新數據也是與刪除同理,需要進行行定位

user = User.query.first()
user.name = 'dong'
db.session.commit()

7. SQLAlchemy框架下的數據查詢

最後的一個知識點是SQLAlchemy框架下的數據查詢,針對不同的場景,SQLAlchemy提供的對應的處理方式:

#查詢有多少個用戶
count = User.query.count()
# 查詢第一個用戶
first_user = User.query.first()
# 查詢id為4的用戶信息(方式1,最常用)
fourth_user = User.query.filter(User.id==4).all()
# 查詢id為4的用戶信息(方式2)
fourth_user = User.query.get(4)
# 查詢id為4的用戶信息(方式3)
fourth_user = User.query.filter_by(id=4).all()
# 查詢名字結尾字符為g的所有數據
endwithg = User.query.filter(User.name.endswith("g")).all()
# 查詢名字開頭字符為g的所有數據
startwithg = User.query.filter(User.name.startswith("z")).all()
# 查詢名字不等於wang的所有數據[2種方式]
notwang = User.query.filter(User.name != "wang").all() # 最常用
notwang = User.query.filter(not_(User.name == "wang")).all()
# 查詢名字和郵箱都以 li 開頭的所有數據[2種方式]
userdd = User.query.filter(User.name.startswith("li"),User.email.startswith("li")).all() #常見
userdd = User.query.filter(and_(User.name.startswith("li"),User.email.startswith("li"))).all()
# 查詢password是`123456`或者`email`以`itheima.com`結尾的所有數據
user = User.query.filter(or_(User.password == "123456",User.email.endswith("itheima.com"))).all()
# 查詢id為[1, 3, 5, 7, 9]的用戶列表SQL語句中範圍查詢 in ,flask中 模型類名.字段.in_(列表)
list1 = [1,3,5,7,9]
user = User.query.filter(User.id.in_(list1)).all()
# 查詢所有用戶數據,並以郵箱排序

user = User.query.order_by(User.id).all()
# 倒序,字段名後加desc()
user = User.query.order_by(User.id.desc()).all()
# 每頁3個,查詢第2頁的數據:ret = paginate(頁碼,每一頁的數據量)
ret = User.query.paginate(2,3)

總結和注意點

  • flask 默認開啟事務,所以操作完成後要 commit 才能提交到數據庫
  • sqlchemy 修改和刪除數據都是基於查詢上的。我們必須先查出數據,all()是查出一行一行數據的列表,first()是查出第一行數據。一定要有這種查出來是一行的思想,才能更好的學習ORM
  • filter 是一個過濾器,裡面寫條件,相當與SQL語句的 where 。但是注意字段名前要寫創建表的類


分享到:


相關文章: