SQLAlchemy數(shù)據(jù)庫(kù)增刪改查 http://www.reibang.com/p/b7704b6cb2ee
ORM是需要了解的:Object-Relational Mapping芳室,把關(guān)系數(shù)據(jù)庫(kù)的表結(jié)構(gòu)映射到對(duì)象上,在Python中,ORM框架是SQLAlchemy。
這里用簡(jiǎn)單的兩張表來(lái)記錄SQLAlchemy數(shù)據(jù)庫(kù)關(guān)聯(lián)的使用。
首先創(chuàng)建在User模型創(chuàng)建了一張表诱告,表名為“user”
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
然后在模型Article中創(chuàng)建了一張名為“article”的表
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
author = db.relationship('User', backref=db.backref('articles'))
這里將User中的id關(guān)聯(lián)到Article中的author_id,也就是author_id就是User中的id。
關(guān)聯(lián)的時(shí)候數(shù)據(jù)類型要保持一致揖曾,如db.Integer。可以通過(guò)Navicat for MySQL中的ER圖標(biāo)來(lái)查看炭剪。
author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
這里我在User表中添加了3條數(shù)據(jù):
在Article中添加了2條數(shù)據(jù)练链,這兩條數(shù)據(jù)是綁定在劉備下的
添加的代碼如下:
username = request.args.get("username")
user = User(username=username)
db.session.add(user)
db.session.commit()
title = request.args.get("title")
content = request.args.get("content")
aitlcle = Article(title=title, content=content, author_id=1)
db.session.add(aitlcle)
db.session.commit()
準(zhǔn)備工作完成了,外鍵肯定是關(guān)聯(lián)成功了奴拦,可以通過(guò)運(yùn)行代碼來(lái)查看:
查看title為“如何收復(fù)漢室媒鼓?”的這個(gè)作者是誰(shuí)
article = Article.query.filter(Article.title == '如何收復(fù)漢室?').first()
author_id = article.author_id
user = User.query.filter(User.id == author_id).first()
下面這種寫法更簡(jiǎn)單错妖,在Article中如此:
author = db.relationship('User', backref=db.backref('articles')):
第一個(gè)參數(shù)為模型User的名字(class User)绿鸣,這個(gè)是正向引用鹃祖, Article引用User
第二個(gè)參數(shù)為反向引用共耍,User引用Article
# 查找劉備還寫過(guò)哪些文章 正向引用 Article引用User
article = Article.query.filter(Article.title == '如何收復(fù)漢室?').first()
print('username:%s' % article.author.username)
上面通過(guò)正向引用纫谅,也就是Article引用User來(lái)得到title為“如何收復(fù)漢室株旷?”的這個(gè)作者是誰(shuí)再登,打印結(jié)果為:
username:劉備
實(shí)現(xiàn)了正向引用,來(lái)看看反向引用晾剖,比如劉備還發(fā)表了哪些文章锉矢,即User引用Article:
user = User.query.filter(User.username == '劉備').first()
articles = user.articles #此處直接反向引用得到所有的文章
for article in articles:
print(article.title)
打印結(jié)果:
如何收復(fù)漢室?
等紙
Flask-SQLAlchemy外鍵多對(duì)多關(guān)系 http://www.reibang.com/p/5282a7525e52