在控制器文件中導入需要的模型類
~~~
from app.admin.model.User import User
~~~
Flask-SQLAlchemy 在 Model 類上提供了 query 屬性。當訪問它時,會得到一個新的所有記錄的查詢對象。在使用 all() 或者 first() 發起查詢之前可以使用方法 filter() 來過濾記錄。如果想要用主鍵查詢的話,也可以使用 get()。
~~~
user = User.query.filter_by(username='admin').first()
~~~
查找一條不存在的數據返回None
使用更復雜的表達式查詢一些用戶:
~~~
User.query.filter(User.username.endswith('@example.com')).all()
~~~
按某種規則對用戶排序:
~~~
User.query.order_by(User.username).all()
~~~
限制返回用戶的數量:
~~~
User.query.limit(1).all()
~~~
用主鍵查詢用戶:
~~~
User.query.get(1)
~~~
獲取數量
~~~
User.query.count()
~~~
在視圖中查詢
當編寫 Flask 視圖函數,對于不存在的條目返回一個 404 錯誤是非常方便的。因為這是一個很常見的問題,Flask-SQLAlchemy 為了解決這個問題提供了一個幫助函數。可以使用 get_or_404() 來代替 get(),使用 first_or_404() 來代替 first()。這樣會拋出一個 404 錯誤,而不是返回 None:
~~~
@admin.route('/user/<username>')
def show_user(username):
user = User.query.filter_by(username=username).first_or_404()
return render_template('show_user.html', user=user)
~~~
模糊查詢
~~~
User.query.filter(User.name.like('xxx%'))
~~~
in查詢
~~~
query.filter(Tags.id.in_([5,6]))
~~~
not in查詢
~~~
query.filter(~Tags.id.in_([1,5,6]))
~~~
and查詢
~~~
from sqlchemy import and_
query.filter(and_(Tags.name == 'Python',Tags.id==2))
~~~
或者
~~~
query.filter(Tags.name == 'Python', Tags.id == 2)
~~~
or查詢
~~~
from sqlalchemy import or_
query.filter(or_(Tags.name == 'Python', Tags.name == 'Flask'))
~~~
原生查詢
~~~
from sqlalchemy import text
query.filter(text('id>=:value1 and id <:value2')).params(value1=2,value2=5)
~~~
完整sql語句查詢
~~~
query.from_statement(text("select * from tags where id=:value")).params(value=1)
~~~
原生查詢數據數量
~~~
db.session.execute("SELECT COUNT(*) FROM table").scalar()
~~~
group by統計數據
~~~
from sqlalchemy import func
db.session.query(Model).with_entities(Model.field, func.count(Model.field)).group_by('field').all()
~~~
#### <font color=red>注:如果想返回json格式數據,需要把查詢出來的結果處理后在返回</font>
首先定義處理模型對象的函數
~~~
def to_json(obj):
_dict = vars(obj)
for i in list(_dict.keys()):
if i.startswith('_'):
_dict.pop(i)
return _dict
~~~
1. 使用json模塊
json模塊的dumps方法可以傳入default參數自定義序列化處理方法
~~~
from flask import jsonify
import json
user = User.get(1)
data = json.dumps(user, default=to_json)
return jsonify(data)#返回json對象
~~~
2. 直接在模型類中定義處理方法
~~~
class User(db.Model):
.
.
.
def obj_json(self):
return to_json(self)
~~~