flask sqlalchemy一对多关系详解
下面的一對多關系以作者和文章為例:
首先創建一個文章表:
class Post(db.Model):
id = db.Column(db.Integer(),primary_key=True)
? ? ? ?title = db.Column(db.String(255))
text = db.Column(db.Text())
publish_date = db.Column(db.DateTime())
user_id = db.Column(db.Integer(),db.ForeignKey('user.id'))
此處注意:
user_id字段,表示一個外鍵約束,(外鍵約束是一種約束規則,它強制要求user_id字段的值存在于user表的id列中,這是數據庫進行的一項檢查,用來保證每個Post對象都會對應得到一個已有的user)
傳給db.ForeignKey的參數,是一個用來代表user表id列的字符串,如果user表中用__tablename__自定義表名,則需要用自定義的表名
(多的一方寫ForeignKey)
?
下面創建作者表:
class User(db.Model):
id = db.Column(db.Integer(),primary_key=True)
username = db.Column(db.String(255))
password = db.Column(db.String(255))
posts = db.relationship('Post',backref='user',lazy='dynamic')
現在我們通過使用User.posts屬性來得到一個posts列表
backref參數可以使我們通過Post.user屬性對User對象進行讀取和修改
簡記:
一的一方寫relationship,可以通過表名.字段得到一個列表
多的一方寫ForeignKey,可以通過表名.(一的一方的backref)對一的一方進行讀取和修改
?
使用Join進行關聯查詢:
join查詢參考下面的鏈接:https://www.thatyou.cn/flask%E4%BD%BF%E7%94%A8flask-sqlalchemy%E6%93%8D%E4%BD%9Cmysql%E6%95%B0%E6%8D%AE%E5%BA%93%EF%BC%88%E4%B8%89%EF%BC%89-%E8%81%94%E8%A1%A8%E4%B8%80%E5%AF%B9%E5%A4%9A%E6%9F%A5%E8%AF%A2/
下面對flask sqlalchemy查詢進行詳細說明:
SQLAlchemy 可以通過Model.query方法對數據進行查詢,Model.query是db.session.query(Model)的簡寫
一,
使用all()獲取數據庫中的所有行,并作為列表返回。
eg1.? ? User.query.all()
可以通過limit()函數來指定希望返回的總行數
User.query.limit(10).all()
可以通過order_by控制排序方式(并不是默認的按照主鍵進行排序)
正向排序:? User.query.order_by(User.username).all()
逆向排序:User.query.order_by(User.username.desc()).all()
如果想只返回一行數據,則可以使用first()代替all()
User.query.first()
要通過主鍵取得一行數據,可使用query.get()
User.query.get(1)
上面的這些函數可以鏈式調用
User.query.order_by(User.username).limit(10).all()
first()和all()方法會返回結果,并且終止鏈式調用,pagination(分頁),可以用來替代first()和all(),不過pagination方法跟first()和all()方法有區別,paginnation得到的是一個pagination對象,而不是對象列表
page=User.query.paginate(1,10)
得到的這個page(pagination對象有幾個屬性)
page.items? ?返回的是User對象列表(這個是最常用的,其他的先不寫)
?
二
條件查詢:
根據一些條件的集合獲得過濾后的數據,要得到滿足一系列等式條件的列表,比如,要得到用戶名為fake_name的用戶列表,可以這樣:
User.query.filter_by(username='fake_name').all()
當然filter_by函數也是可以鏈式調用的,如下:
User.query.order_by(User.username.desc()).filter_by(username='fake_name').limit(2).all()
注意:filter_by只有在你確切的知道查找的值時,才可以用
filter則可以避免(filter可以接受任何python表達式<,>,==)
User.query.filter(user.id>1).all()
?
轉載于:https://www.cnblogs.com/daqingzi/p/9454969.html
總結
以上是生活随笔為你收集整理的flask sqlalchemy一对多关系详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 验证视图状态MAC失败的解决办法
- 下一篇: SQL优化案例