flask系列四之SQLAlchemy(二)表關係

1、SQLAlchemy外鍵約束

1.建立外鍵約束表結構

目標:創建兩個表「用戶表(user)」和「問題表( question)」,其中問題表中的做者id是是用戶表的id即外鍵的關係。(一個用戶能夠有多個問題)html

Python語句數據庫

(1)用戶類flask

class User(db.Model): __tablename__ = 'user'#用戶表 id=db.Column(db.Integer,primary_key=True, autoincrement=True) telephone=db.Column(db.String(11), nullable=False) username=db.Column(db.String(50), nullable=False) password=db.Column(db.String(100), nullable=False) confirmPassword = db.Column(db.String(100), nullable=False)

(2)問題類服務器

from datetime import datetime
class
Question(db.Model): __tablename__ = 'question'#問題表 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) # now()獲取服務器第一次容許的時間 # now 是每次建立一個模型的時候都獲取當前的時間 create_time = db.Column(db.DateTime, default=datetime.now) # 定義外鍵 ---外鍵指定--使用表名 author_id = db.Column(db.Integer, db.ForeignKey('user.id'))

   #外鍵依賴--使用模型名稱(類名稱)
   # backref表達的是:一個author對應多個questions
author
= db.relationship('User', backref=db.backref('questions'))
# 能夠使用:authour.questions 得出當前做者的全部問題
 

 

2.數據庫添加用戶和問題

1.要想添加一個問題,由於問題必須依賴用戶而存在,因此首先要先添加一個用戶並登陸成功。

 userObj = User(telephone=‘xxxx’, username='xx', password='xx',confirmPassword='xx') db.session.add(userObj) db.session.commit()

2.在用戶已經登陸的的基礎上添加一個問題。

from decorations import login_required
@app.route('/question/', methods=["GET", "POST"]) @login_required def question(): if request.method == "GET":# 加載頁面 return render_template("question.html") else:# 接收表單提交 title = request.form.get("title") content = request.form.get("content") question = Question(title=title, content=content) user_id = session.get("user_id")# user_id:登陸用戶的id經過session記錄 user = User.query.filter(User.id == user_id).first() question.author = user db.session.add(question) db.session.commit() return redirect(url_for('index'))

注意此處使用裝飾器login_required來處理是否登陸問題:session

decorations.py中:app

from functools import wraps from flask import session,redirect,url_for # 登陸限制裝飾器
def login_required(func): @wraps(func) def wrapper(*args, **kwargs): if session.get('user_id'): return func(*args, **kwargs) else: return redirect(url_for("login")) return wrapper

使用裝飾器後,若用戶沒有登陸,須要添加問題則會首先跳轉到登陸頁面,登陸後才能操做。ui

3.查找問題的做者

 question = Question(title=title, content=content) user_id = session.get("user_id") user = User.query.filter(User.id == user_id).first() question.author = user# 問題的做者 db.session.add(question) db.session.commit()

4.列出某個做者寫過的全部問題

利用反向引用(backref)來,根據做者名字,查找出做者寫過的全部文章。url

# 使用的方法
user = Users.query.filter(Users.username=='xxx').first() result = user.questions# 做者添加的全部問題
for question in result: pass

2、多對多關係講解

(1)多對多的關係,須要經過一箇中間表進行關聯。spa

(2)中間表,不能經過class的方式實現,只能經過db.Table的方式實現。.net

(4)設置關聯:tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))須要使用一個關鍵字參數secondary=中間表 來進行關聯。

待續。。。能夠參考:http://blog.csdn.net/qq_28877125/article/details/77664575

相關文章
相關標籤/搜索