知識點:
1.flask_sqlalchemy查詢:
Flask-SQLAlchemy 在您的 Model
類上提供了 query
屬性。當您訪問它時,您會得到一個新的所有記錄的查詢對象。在使用 all()
或者 first()
發起查詢之前可以使用方法 filter()
來過濾記錄。如果您想要用主鍵查詢的話,也可以使用 get()
2.flask視圖
3.熟練sql查詢
前置條件:
本地數據庫創建一個測試庫(test)&表(roles),該表只有2個字段,id,name,結構如圖:
示例:
通過1個字段簡單的查詢 :
#通過用戶名查詢用戶
lisa= Role.query.filter_by(name='張飛').first()
注意:如果查詢一個不存在的用戶名返回 None:
復雜一點帶條件的查詢:
#帶表達式的查詢
obj = Role.query.filter(Role.email.endswith('@163.com')).all() print(obj)#[<Role '曹操'>, <Role 'lisa'>]
排序
#按某種規則對用戶排序
obj1 = Role.query.order_by(Role.name).all() print(obj1)#[<Role 'bob'>, <Role 'lisa'>, <Role '張飛'>, <Role '曹操'>]
限制返回數量
1 #限制返回用戶的數量
2 obj2= Role.query.limit(1).all() 3 print(obj2)#[<Role '曹操'>]
用主鍵查詢
#用主鍵id
obj3 = Role.query.get(1) print(obj3)#<Role '曹操'>
在flask視圖中查詢:
當您編寫 Flask 視圖函數,對於不存在的條目返回一個 404 錯誤是非常方便的。因為這是一個很常見的問題,Flask-SQLAlchemy 為了解決這個問題提供了一個幫助函數。可以使用 get_or_404()
來代替 get()
,使用 first_or_404()
來代替 first()
。這樣會拋出一個 404 錯誤,而不是返回 None
#在視圖中查詢
@app.route('/role/<id>') def show_user(id): # role = Role.query.filter_by(name=rolename).first_or_404()
role = Role.query.get_or_404(id,"not find ") return jsonify({'id':role.id,'name':role.name,'email':role.email})
完整代碼:
1 #導入依賴
2 from flask import Flask,jsonify 3 from flask_sqlalchemy import SQLAlchemy 4 #創建一個服務
5 app = Flask(__name__) 6
7 #配置app屬性
8 # 設置連接數據庫的URL
9 app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+mysqlconnector://root:admin123456@10.1.71.32:3306/test'
10
11 # 設置每次請求結束后會自動提交數據庫的改動
12 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True 13 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 14
15 # 查詢時顯示原始SQL語句
16 app.config['SQLALCHEMY_ECHO'] = False 17
18 #response顯示中文json,
19 app.config['JSON_AS_ASCII']=False 20
21 #生成一個sqlalchemy對象
22 db = SQLAlchemy(app) 23
24 #創建模型,在python中通過Role類映身roles表
25 class Role(db.Model): 26 __tablename__ = 'roles'
27 id = db.Column(db.Integer, primary_key=True) 28 name = db.Column(db.String(64)) 29 email=db.Column(db.String(64)) 30
31 def __repr__(self): 32 return '<Role %r>' % self.name 33
41 #通過用戶名查詢用戶
42 lisa= Role.query.filter_by(name='張飛').first() 43 # print(type(lisa),lisa) #<class '__main__.Role'> <Role '張飛'>
44
45 #帶表達式的查詢
46 obj = Role.query.filter(Role.email.endswith('@163.com')).all() 47 # print(obj)#[<Role '曹操'>, <Role 'lisa'>]
48
49 #按某種規則對用戶排序
50 obj1 = Role.query.order_by(Role.name).all() 51 # print(obj1)#[<Role 'bob'>, <Role 'lisa'>, <Role '張飛'>, <Role '曹操'>]
52
53 #限制返回用戶的數量
54 obj2= Role.query.limit(1).all() 55 # print(obj2)#[<Role '曹操'>]
56
57 #用主鍵id
58 obj3 = Role.query.get(1) 59 print(obj3)#<Role '曹操'>
60
70 #在視圖中查詢
71 @app.route('/role/<id>') 72 def show_user(id): 73 # role = Role.query.filter_by(name=rolename).first_or_404()
74 role = Role.query.get_or_404(id,"not find ") 75 return jsonify({'id':role.id,'name':role.name,'email':role.email}) 76
77 if __name__ == '__main__': 78 app.run(debug=True)
運行結果:
運行程序,在瀏覽器中輸入:http://127.0.0.1:5000/role/1
1.輸入1個存在的id:
2.輸入1個不存在的id:
可以在這里自定義提示信息:
1 role = Role.query.get_or_404(id,"not find ")
其它:
flask-sqlalchemy的增刪改查操作參見文檔,描寫的很清晰了:
選擇(Select),插入(Insert), 刪除(Delete)
http://www.pythondoc.com/flask-sqlalchemy/queries.html
修改數據
1 user = User.query.get(20) 2 3 user.name ='小名' 4 5 db.session.commit()