Python Web 之 Flask-SQLAlchemy 框架

數據庫 ORM 框架

什麼是ORM?

Object-Relationl Mapping,它的作用是在關係型數據庫和對象之間做一個映射,這樣我們在具體的操作數據庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了 。簡單說,ORM是一個可以使我們更簡單的操作數據庫的框架。

SQLAlchemy是什麼?Flask-SQLAlchemy 又是什麼?
SQLAlchemy是Python語言的一個關係型數據庫框架,它提供了高層的 ORM 和底層的原生數據庫的操作,讓開發者不用直接和 SQL 語句打交道,而是通過 Python 對象來操作數據庫,在捨棄一些性能開銷的同時,大大提高了開發效率。

Flask-SQLAlchemy是一個簡化了 SQLAlchemy 框架的Flask擴展,封裝了對數據庫的基本操作。該擴展既可結合Flask框架一起使用,也可以單獨安裝使用,非常靈活。

MySql-8安裝

Windows 免安裝版

下載並解壓免安裝版,使用管理員權限啓動cmd命令行工具,cd進入解壓目錄

  1. 新建配置文件 my.ini

    [mysql]
    # 設置客戶端默認字符集
    default-character-set=utf8mb4
    [mysqld]
    default_password_lifetime=0
    
    port=3306
    
    # 安裝目錄
    basedir=D:\MySql\mysql-8.0.16-winx64
    # 數據目錄
    datadir=D:\MySql\Data
    
    # 最大連接數
    max_connections=200
    # 允許連接失敗的次數
    max_connect_errors=10
    
    # 服務端默認使用的字符集
    character-set-server=utf8mb4
    # 默認的儲存引擎
    default-storage-engine=INNODB
    
    # 插件認證方式
    default_authentication_plugin=mysql_native_password
    
    [client]
    # 客戶端連接服務端時默認端口
    port=3306
    default-character-set=utf8mb4
    

    修改basedirdatadir爲自己實際的路徑

  2. 初始化數據庫

    bin\mysqld --initialize --console
    

    執行完命令,需記住命令行輸出的root@localhost:後面的隨機密碼

  3. 安裝服務

    bin\mysqld --install
    
  4. 啓動服務

    net start mysql
    
  5. 首次連接修改密碼

    bin\mysql -u root -p
    

    輸入直接記住的隨機密碼登錄後,執行以下命令修改密碼,將'password'中的值替換爲自己的想要的密碼

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    

圖形化客戶端

Navicat Premium
下載並安裝 https://www.navicat.com.cn/download/navicat-premium

關於破解

建議個人學習用,公司裏不要用破解

破解方法

Flask-SQLAlchemy

安裝 flask-sqlalchemy

pip install flask-sqlalchemy

安裝pymysql驅動

pip install pymysql

連接不同的數據庫,有不同的URL格式,本文以MySQL爲例

URL格式
在這裏插入圖片描述

實例:

import os
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)

# 此處使用pymysql作爲驅動
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:password@localhost:3306/my_db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class User(db.Model):
    # 第一個參數指定字段類型,後面設置屬性,詳見以下常用參數表
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)

class Message(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 關聯外鍵(表名.字段名)


# 創建表
db.create_all()

# 插入數據
user = User(username='張三')
db.session.add(user)
# 提交
db.session.commit()

# user提交後纔會生成id,用於Message的外鍵author_id
msg = Message(content='你好,世界',author_id=user.id)
db.session.add(msg)
db.session.commit()


if __name__ == "__main__":
    app.run()

SQLAlchemy常用參數

參數 說明
primary_key 如果設爲 True,列爲表的主鍵
unique 如果設爲 True,列不允許出現重複的值
index 如果設爲 True,爲列創建索引,提升查詢效率
nullable 如果設爲 True,列允許使用空值;如果設爲 False,列不允許使用空值
default 爲字段設置默認值

SQLAlchemy常用字段類型

類型 說明
Integer 整數
Float 浮點數
String 變長字符串,可設置length
Text 變長字符串,對較長或不限長度的字符串做了優化
Boolean 布爾值
Date Python中的datetime.date 日期
Time Python中的 datetime.time 時間
DateTime Python中的 datetime.datetime 日期和時間
Interval Python中的 datetime.timedelta 時間間隔
Enum 枚舉,一組字符串
PickleType 任何 Python 對象 自動使用 Pickle 序列化
LargeBinary 任意二進制數據

CRUD操作

Create 插入數據

1.實例化模型類
2.添加新創建的記錄到數據庫會話
3.提交數據庫會話

    user = User(username='張三')
    db.session.add(user)
    db.session.commit()

Read 查詢數據

<模型類>.query.<過濾方法>.<查詢方法>

    # 查詢全部
    User.query.all()
    # 過濾條件,並以列表形式,返回所有結果
    User.query.filter_by(username="張三").all()
    # 返回結果中的第一個
    User.query.filter_by(username="張三").first()

過濾方法

過濾器 說明
filter() 把過濾器添加到原查詢上, 返回一個新查詢
filter_by() 把等值過濾器添加到原查詢上, 返回一個新查詢
limit() 使用是zing的值限制原查詢返回的結果數量, 返回一個新查詢
offset() 偏移原查詢返回的結果, 返回一個新查詢
order_by() 根據指定條件對原查詢結果進行排序, 返回一個新查詢
group_by() 根據指定條件對原查詢結果進行分組, 返回一個新查詢

查詢方法

方法 說明
all() 以列表形式返回查詢的所有結果
first() 返回查詢的第一個結果,如果沒有結果,則返回 None
count() 返回查詢結果的數量
get() 返回指定主鍵對應的行,如果沒有對應的行,則返回 None

Update 修改數據

直接賦值給模型類的字段屬性就可以改變字段值, 然後調用commit()方法提交會話即可

user = User.query.get(1)
user.username='李四'
db.session.add(user)
db.session.commit()

Delete 刪除數據

刪除和插入類似,把add()方法換成delete()方法, 最後調用commit()方法提交

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

定義實體關係

定義兩張表之間的關係

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    pub_date = db.Column(db.DateTime)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    
    # 定義表之間的關係
    category = db.relationship('Category',backref=db.backref('posts', lazy='dynamic'))

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
選項名 說明
backref 在關係的另一個模型中添加反向引用
primaryjoin 明確指定兩個模型之間使用的聯結條件。只在模棱兩可的關係中需要指定.
lazy 指定如何加載相關記錄。
uselist 如果設爲 Fales,不使用列表,而使用標量值
order_by 指定關係中記錄的排序方式
secondary 指定多對多關係中關係表的名字
secondaryjoin SQLAlchemy 無法自行決定時,指定多對多關係中的二級聯結條件

歡迎關注我的公衆號:編程之路從0到1

編程之路從0到1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章