5、flask第五站-簡單數據庫

數據庫基礎知識

1、關係型數據庫

特徵:多表查詢,設有外鍵,節省空間但是查詢慢。
這裏寫圖片描述
常見的有:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL等。

2、非關係型數據庫

特徵:普通的鍵值對,查詢快,但是佔用空間大。

常見的有:NoSql、Cloudant。

使用Flask-SQLAlchemy管理數據庫

1、準備

【init.py】

from flask_sqlalchemy import SQLAlchemy
#導入數據庫
import os
base_path = os.path.abspath(os.path.dirname(__file__))
#得到當前數據庫的絕對路徑
app.config['SQLACHEMY_DATABASE_URI'] = 'sqlite:///'+os.path.join(base_path,'data.sqlite')
#數據庫的URL 保存到 Flask 配置對象的 SQLALCHEMY_DATABASE_URI 鍵中
app.config['SQLACHEMY_COMMIT_ON_TEARDOWN'] = True
#讓數據庫自動提交數據庫中的變動
db = SQLAlchemy(app)
#生成對象關係映射

2、定義模型和關係

【models.py】

#上圖中的 roles 表和 users 表可定義爲模型 Role 和 User
class Role(db.Model):
    __tablename__ = 'roles'
    #定義數據庫的表名,不定義的話會被默認設置。
    id = Column(Integer,primary_key=True)
    #設置一個id列,括號裏第一個參數爲類型,此處Int,第二個參數設置成主鍵
    name = Column(String(64),unique=True)
    #設置一個name列,字符串類型長度64,第二個參數是否唯一:是。
    users = db.relationship('User',backref='role')
    # 定義一個關係,注意第一個參數是類名,第二個參數是反向引用
    def __repr__(self):
        return '<Role %r>' % self.name
    #返回一個具有可讀性的字符串表示模型,可在調試和測試時使用。

class User(db.Model):
    __tablename__ = 'users'
    id = Column(Integer,primary_key=True)
    username = Column(String(64),unique=True,index=True)
    password = Column(String(64))
    def __repr__(self):
        return '<User %r>' % self.username
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))  
    # 外鍵的參數不是類名,而是表名

一些可用的列類型以及在模型中使用的 Python 類型。

這裏寫圖片描述

db.Column 中其餘的參數指定屬性的配置選項:

這裏寫圖片描述

兩個表的連接

    關係使用 users 表中的外鍵連接了兩行。添加到 User 模型中的 role_id 列被定義爲外鍵, 就是這個外
鍵建立起了關係。傳給 db.ForeignKey() 的參數 ‘roles.id’ 表明,這列的值是 roles 表中行的 id
值。

    添加到 Role 模型中的 users 屬性代表這個關係的面向對象視角。對於一個 Role 類的實例,其 users
屬性將返回與角色相關聯的用戶組成的列表。 db.relationship() 的第一個參數表明這個關係的另一端是
哪個模型。如果模型類尚未定義,可使用字符串形式指定。

    db.relationship() 中的 backref 參數向 User 模型中添加一個 role 屬性,從而定義反向關係。這一屬
性可替代 role_id 訪問 Role 模型,此時獲取的是模型對象,而不是外鍵的值。

3、在視圖函數中操作數據庫

基本操作

1、創建數據庫

    db.drop_all()
    #刪除數據庫,當前有庫在,想重新建庫時,可以刪除操作。
    db.create_all()

2、插入行

#插入操作分爲兩個步驟:
1. 創建一個新的模型對象:
admin_role = Role(name='Admin')
2. 添加到會話中:
db.session.add(admin_role)  

3、修改行

#修改操作分爲兩個步驟:
1. 修改模型對象
admin_role.name = 'Administrator'
2. 添加到會話中:
db.session.add(admin_role)
#可以看出無論是添加還是修改,第二部添加到數據庫的操作都一樣

4、刪除行

刪除操作只有一個步驟:
db.session.delete(mod_role)

5、查詢行

Role.query.all()
#查詢所有
User.query.filter_by(role=user_role).all()
#帶過濾器的查詢

常用的SQLAlchemy查詢過濾器

這裏寫圖片描述

常使用的SQLAlchemy查詢執行函數

這裏寫圖片描述

【sql.html】

{% extends "bsbase.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %}Flasky{% endblock %}
{% block page_content %}
<div class="page-header">
<h1>Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}!</h1>
{% if not known %}
#判斷是不是還是之前用戶
<p>Nice to meet you!</p>
{% else %}
<p>Happy to see you again!</p>
{% endif %}
</div>
{{ wtf.quick_form(form) }}
#快速創建表單
{% endblock %}

4、設置路由

【views】

# 先刪除舊錶再重新創建新表
db.drop_all()
db.create_all()


@app.route('/sql/',methods = ['GET','POST'])
def sql():
    form = NameForm()
    if form.validate_on_submit():
        # 查詢是否存在用戶輸入的用戶
        user = User.query.filter_by(username=form.name.data).first()
        print(user)
        # 若不存在
        if user is None:
            user = User(username=form.name.data)
            # 添加數據
            db.session.add(user)
            # 標記爲不認識這個人
            session['known'] = False
        else:
            session['known'] = True
        session['name'] = form.name.data
        return redirect(url_for('hello'))
    return render_template('sql.html',form = form,
        name = session.get('name'),
        known = session.get('known',False))

5、使用Flask-Migrate實現數據庫遷移

主要功能:修改數據庫模型,而且修改之後還需要更新數據庫

步驟一:(venv) $ python hello.py db init
    #在維護數據庫遷移之前,要使用 init 子命令創建遷移倉庫
步驟二:(venv) $ python hello.py db migrate
    #使用 migrate 子命令自動創建遷移腳本
步驟三:(venv) $ python hello.py db upgrade
    #使用 upgrade 子命令把遷移應用到數據庫中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章