1. 程式人生 > >Flask框架教程彙總(5)---其中有原生sql +資料庫增刪改查+ migrate遷移 等

Flask框架教程彙總(5)---其中有原生sql +資料庫增刪改查+ migrate遷移 等

本節目錄:
1 原生sql資料庫
2 在flask中使用ORM模型
3 設計表模型
4 建立模型
5 資料的增/刪/改操作
6 拆分成mvt
7 自定義刪除的類
8 資料的查詢操作
9 資料的邏輯查詢
10 flask-migrate 遷移

本教程的flask環境都是在ubuntu 16.04下 —python3.5—IDE為pycharm 如果有任何問題可以留言哦 !

sqlalchemy
需要安裝: sudo pip3 install flask-sqlalchemy

ORM使用的好處

1.減少sql的重複使用率 ( 從資料庫儲存、刪除、讀取物件資訊,而這些程式碼都是重複的 , ORM則會大大減少重複性程式碼。)
2.使表更具有可讀性
3.可移植性
4. 避免了sql語句過多的冗餘, 不規範等, 方便維護

一、原生sql

(1) 新建一個數據庫

create database if not exists 庫名 character set utf8;

alter database 庫名 character set utf8;

alter table 表名 character set utf8;

alter table 表名 modify 欄位名 欄位型別 可選約束條件 character set utf8

(2) 安裝操作資料庫的模組

pip3 install pymysql

(3) 安裝 flask-sqlalchemy

sudo pip3 install flask-sqlalchemy

(4) 配置路徑

DB_URI = ‘mysql+pymysql://root:[email protected]:port/database’

例項

    from sqlalchemy import create_engine

    HOST = '127.0.0.1'
    #資料庫使用者名稱
    USERNAME = 'root'
    #對應的使用者名稱密碼
    PASSWORD = '123456'
    #資料庫的名稱, 需要先去create建立此資料庫
    DATABASE = 'demo'\
    #mysql資料庫預設埠號
    PORT = 3306
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE) engine = create_engine(DB_URI) with engine.connect() as db: data = db.execute('select * from user') # print(data) # for row in data: # print(row) db.execute('delete from user where id=1')

二、在flask中使用ORM模型

配置

    from flask_sqlalchemy import SQLAlchemy

    app = Flask(__name__)
    #配置連結資料庫
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:[email protected]:3306/demo'
    #開啟自動提交 不需要提交或者回滾
    app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    #關閉資料追蹤的配置 關閉佔據額外的消耗的資源
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db = SQLAlchemy(app) #例項化ORM
    manager = Manager(app)

三、設計表模型

(1) 欄位型別

  型別名         python中的型別       說明         
  Integer       int                 儲存整形 32位   
  SmallInteger  int                 小整形 16為    
  BigInteger    int                 大整形        
  Float         float               浮點數        
  String        str                 字串 varchar
  Text          str                 長文字        
  Boolean       bool                bool值      
  Date          datetimedate        日期         
  Time          datetime.time       時間         
  datetime      datetime.datetime   時間日期       

(2) 可選條件

選項 說明
primary_key 主鍵
unique 唯一索引
index 常規索引
nullable 是否可以為null 預設True
default 預設值

四、建立模型

 #自定義模型類
    class User(db.Model):
        __tablename__ = 'user' #起表名
        id = db.Column(db.Integer,primary_key=True)
        username = db.Column(db.String(20))
        sex = db.Column(db.Boolean,default=True)
        info = db.Column(db.String(50))

建立表

    @app.route('/create')
    def create():
        db.drop_all() #刪除表
        db.create_all() #建立表
        return '建立表'

五、資料的增add add_all 刪 delete 改

(1) 新增一條資料 add

    @app.route('/insert/')
    def insert():
        try:
            u = User(username='王五',info='王五的預設值')
            db.session.add(u)
            db.session.commit() #事物的提交
        except:
            db.session.rollback() #回滾
            pass
        return '新增數成功'

(2) 新增多條資料 add_all

    @app.route('/insert_many/')
    def insert_many():
        u1 = User(username='李四', info='李四的預設值')
        u2 = User(username='趙六', info='趙六的預設值')
        db.session.add_all([u1,u2]) #多條資料物件 放在列表中
        db.session.commit()
        return '新增多條資料'

(3) 修改資料

 #資料的修改
    @app.route('/update/')
    def update():
        u = User.query.get(1)  #拿到id為1的資料物件
        # print(u) #資料物件
        # print(u.username) #獲取username屬性的值
        u.username = '新暱稱'
        db.session.add(u)
        db.session.commit()
        return '修改'

(4) 刪除 delete

    #刪除
    @app.route('/delete/')
    def delete():
        u = User.query.get(1)
        db.session.delete(u)
        db.session.commit()
        return '刪除id為1的資料'

注意:

sqlalchemy預設開啟了事物處理

操作完成以後需要提交或者回滾

    db.session.commit()
    db.session.rollback()

六、拆分成mvt

目錄結構

    project/
        manage.py
        exts/
        settings.py
        app/
            __init__.py
            models.py
            views.py
        templates/
        static/

七、自定義增刪改類
model中的程式碼

 class Base:
        #儲存
        def save(self):
            try:
                db.session.add(self)
                db.session.commit()  # 事物的提交
            except:
                db.session.rollback() #回滾
        #靜態方法
        @staticmethod
        def save_all(List):
            try:
                db.session.add_all(List)
                db.session.commit()  # 事物的提交
            except:
                db.session.rollback() #回滾
        #刪除
        def delete(self):
            try:
                db.session.delete(self)
                db.session.commit()  # 事物的提交
            except:
                db.session.rollback() #回滾
    #自定義模型類
    class User(db.Model,Base):
        ...

在views中的使用

 #新增資料
    @view.route('/insert/')
    def insert():
        # u = User(username='王五',info='王五的預設值')
        u = User('張三','張三的預設值')
        u.save()
        return '新增資料'

    @view.route('/saveall/')
    def saveall():
        u1 = User('張123','張123的預設值')
        u2 = User('123張','123張的預設值')
        User.save_all([u1,u2])
        return '新增多個值'

    @view.route('/delete/')
    def delete():
        u1 = User.query.get(3)
        u1.delete()
        return '刪除資料'

八、資料庫的操作

查詢集

資料查詢的集合

  1. 原始查詢集
    不經過任何過濾器返回的結果集 為原始查詢集
  2. 資料查詢集
    將原始查詢集經過條件的篩選最終返回的資料

過濾器

(1) all() 得到所有的資料查詢集 返回列表

類名.query.all() 不能夠鏈式呼叫

   @view.route('/all/')
    def all():
        data = User.query.all()
        print(data)
        return '刪除資料'

(2) filter() 過濾預設查詢所有

類名.query.filter()

類名.query.filter(類名.屬性名 條件操作符 條件)

    #filter 獲取所有資料查詢集
    @view.route('/filter/')
    def filter():
        # data = User.query.filter()
        # data = User.query.filter(User.username=='王五')
        data = User.query.filter(User.username=='王五',User.sex==False)
        print(data)
        for i in data:
            print(i.username,i.sex)
        return '刪除資料'

(3) filter_by() 單條件查詢

    @view.route('/filter_by/')
    def filter_by():
        # data = User.query.filter_by()
        #錯誤寫法
        # data = User.query.filter_by(id!=1)
        data = User.query.filter_by(age=18)
        #只能為下面這種關鍵字的用法   且多個新增為and操作
        # data = User.query.filter_by(username='王五',sex=False)
        # data = User.query.filter_by(username='王五',sex=False)

(4) offset(num) 偏移量

    @view.route('/offset/')
    def offset():
        # data = User.query.filter().offset(1)
        # data = User.query.filter().offset(2)
        #錯誤的用法
        data = User.query.all().offset(2)
        # print(User.query.filter())
        # print(data)
        # for i in data:
        #     print(i.username,i.sex)
        return '刪除資料'

(5) limit() 取值

    @view.route('/offsetlimit/')
    def offsetlimit():
        data = User.query.offset(2).limit(2)
        print(data)
        for i in data:
            print(i.username,i.sex)
        return 'limit'

(6) order_by() 排序
1. 預設升序
2. -屬性名(降序)

    @view.route('/orderby/')
    def orderby():
        #升序
        data = User.query.order_by(User.age).limit(1)
        #降序
        data = User.query.order_by(-User.age).limit(1)

(7) first() 取出一條資料

 @view.route('/first/')
    def first():
        # data = User.query.first()  == User.query.get(1)
        # data = User.query.order_by(-User.age).first()
        data = User.query.order_by(User.age).first()
        print(data.age)
        print(data.username)
        # for i in data:
        #     print(i.username,i.sex)

(8) get() 取得id值的資料

查詢成功 返回 物件

查詢失敗 返回 None

    data = User.query.get(10)
    print(data)

(9) contains 包含關係

類名.query.filter(類名.屬性名.contains(‘值’))

    data = User.query.filter(User.username.contains('五'))

(10) like 模糊查詢

類名.query.filter(類名.屬性名.like(‘%值%’))

    data = User.query.filter(User.username.like('%張%')) #包含張
    data = User.query.filter(User.username.like('%張'))  #以張作為結尾 
    data = User.query.filter(User.username.like('張%'))  #以張作為開頭

(11) startswith 以…開頭 endswith以…結尾

    data = User.query.filter(User.username.startswith('張')) #以 張作為開頭
    data = User.query.filter(User.username.endswith('張'))   #以張作為結尾

(12) 比較運算子

  1. gt 大於
  2. ge 大於等於
  3. lt 小於
  4. le 小於等於
  5. >
  6. <
  7. >=
  8. <=
  9. !=
  10. ==
    data = User.query.filter(User.id>1) #查詢id大於1的資料
    data = User.query.filter(User.id.__gt__(1)) #查詢id大於1的資料
    data = User.query.filter(User.id.__ge__(1)) #查詢id大於1的資料
    data = User.query.filter(User.id>=1) #查詢id大於1的資料
    data = User.query.filter(User.id<3) #查詢id大於1的資料
    data = User.query.filter(User.id.__lt__(3)) #查詢id大於1的資料

(13) in_ 和 not in 是否包含某個範圍內

 #in的使用
    @view.route('/in/')
    def myin():
        data = User.query.filter(User.id.in_([1,2,3,4])) #在...範圍內
        data = User.query.filter(~User.id.in_([1,2,3,4])) #not in不再...範圍內
        data = User.query.filter(User.username.in_(['張三','王五']))
        return render_template('show.html',data=data)

(14) is_ isnot 查詢為null/不為null 的資料

    #對於null資料的處理
    @view.route('/null/')
    def null():
        #查詢為null資料的
        data = User.query.filter(User.username.is_(None))
        data = User.query.filter(User.username == None)
        data = User.query.filter(~User.username.isnot(None))
        #查詢不為null資料的
        data = User.query.filter(~User.username.is_(None))
        data = User.query.filter(User.username.isnot(None))
        data = User.query.filter(User.username != None)

        return render_template('show.html',data=data)

九、資料庫的邏輯查詢

    from sqlalchemy import and_,or_,not_

(1) 邏輯與 and_

    #邏輯操作
    @view.route('/and/')
    def myand():
        data = User.query.filter(User.sex==True,User.age<20)
        data = User.query.filter(User.sex==True).filter(User.age<20)
        data = User.query.filter(and_(User.sex==True,User.age<20))
        return render_template('show.html',data=data)

(2) 邏輯活 or_

 #邏輯操作
    @view.route('/or/')
    def myor():
        #or
        data = User.query.filter(or_(User.sex==True,User.age<20),User.id.in_([1,2,3]))
        #and 和 or的 一起使用
        data = User.query.filter(or_(User.sex==True,User.age<20))
        return render_template('show.html',data=data)

(3) 邏輯非 not_

    #邏輯操作
    @view.route('/not/')
    def mynot():
        data = User.query.filter(not_(User.sex==True))
        #錯誤寫法只能有一個條件
        data = User.query.filter(not_(User.sex==True,User.id!=1))
        data = User.query.filter(~User.sex==True)
        return render_template('show.html',data=data)

(4) count 統計

    @view.route('/count/')
    def mycount():
        #統計性別為sex的資料條數
        data = User.query.filter(not_(User.sex == True)).count()
        #統計所有資料的條數
        data = User.query.filter().count()
        data = User.query.count()
        return '{}條資料'.format(data)

十、flask-migrate 檔案的遷移

安裝:

  1. flask-script
  2. flask-migrate

使用

    from flask_migrate import Migrate,MigrateCommand
    migrate = Migrate(app,db)
    manager = Manager(app)
    manager.add_command('db',MigrateCommand) #給manage新增遷移檔案的命令

(1) 生成遷移檔案目錄

python3 manage.py db init

生成 一個 migrations的遷移檔案目錄

(2) 生成遷移檔案

python3 manage.py db migrate

(3) 執行遷移檔案

python3 manage.py db upgrade

技術交流可以留言評論哦 ! 虛心學習, 不忘初心, 共同奮進 !

相關推薦

Flask框架教程彙總(5)---其中原生sql +資料庫刪改+ migrate遷移

本節目錄: 1 原生sql資料庫 2 在flask中使用ORM模型 3 設計表模型 4 建立模型 5 資料的增/刪/改操作 6 拆分成mvt 7 自定義刪除的類 8 資料的查詢操作 9 資料的邏輯查詢 10

flask和django區別--資料庫刪改的區別

flask和django都是一樣的,在你建立了資料模型之後,兩個框架都會給你資料庫操作的api,供你使用;(create retrieve update delete) 假設我們有一個User類 增加(插入): 對於flask的插入分為三步走的情況: 1:建立python 物件;也就

layui進行分頁處理,後端返回資料沒有count欄位,需要單獨獲取再新增到資料中,再進行項渲染,另layui表格資料刪改前後端互動

整體效果圖如下: (1)分頁前端介面處理 (2)分頁後端的資料處理 具體程式碼如下: 前端介面程式碼:包括分頁,增刪改查,重新整理(搜尋功能還沒做,後端是java程式碼) <!DOCTYPE html> <html> <hea

MyBatis框架基於Annotation註解的資料庫刪改操作

 程式碼: User.java package com.bean; import java.io.Serializable; public class User implements Serial

SpringBoot框架整合SSM實現簡單資料庫刪改

首先建立一個Maven工程 第一步:選擇Maven專案建立結構 第二步:配置專案屬性 點選finish即可完成建立 再來看一下專案的目錄 然後配置pom.xml依賴檔案  <?xml version="1.0" encoding="U

Flask中之數據庫框架和模型類四:再述SQLAlchemy配置和基本操作之刪改

模糊 offset odi com app ack 字符 add () from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) #設置連接數據庫的URL

Larave5.*框架 資料庫的CURD刪改操作教程

Laravel提供了3種操作資料庫方式:DB facade(原始方式)、查詢構造器和Eloquent ORM。下面我將逐一講解。 資料庫的配置檔案在config目錄下的database.php裡。開啟這個檔案,找到MySQL的配置項。 這裡有個env,它其實

yii2 框架的 AR 和 DAO 刪改

寫法 mod sar 增刪改查 title isn function rec 自己 自己做個總結 方便以後查找使用 /** * yii 的增刪改查 */ //增 public function add1($data) {

.NET EF 框架-實現刪改

ont int string dbcontext 增刪 base set cts cti 聲明一個EF上下文對象 Model dbContext=new Model(); 添加操作(向表中插入一條數據) //聲明一個表的實體 Contact contact =new Con

Struts2+Spring+Hibernate實現員工管理刪改功能(一)之ssh框架整合

pri support scrip ext ack efault ring src 兩張 前言 轉載請標明出處:http://www.cnblogs.com/smfx1314/p/7795837.html 本項目是我寫的一個練習,目的是回顧ssh框架的整合以及

cocos2d-x-lua基礎系列教程六(lua-table刪改

{} cat ng-click 位置 rip 腳本 ack content -c lua-table庫 1。插入 table.insert () --假設沒有設定位置。默認last位置 樣例: myTable = {

文件操作,是一個存為字符串格式的登陸系統,刪改的功能,但不是我想要的。。。

str repl 修改 blog 一個 ice body pwd 刪除 def register(NAME, PWD, TEL): with open(‘userdate.txt‘, ‘a‘, encoding=‘utf-8‘) as f: new

通過flask實現web頁面簡單的刪改

bug html red end pla pan fileutil log class 通過flask實現web頁面簡單的增刪改查 # 1.後臺程序falsk_web01.py #coding:utf-8 from flask import Flask

spring boot 2.X 集成 Elasticsearch 5.x 實戰 刪改

springboot2.x Elasticsearch5.x 集成 實戰 增刪改查 其實這種博客網上一大片,為啥還要寫出來這篇博客?網上的例子都是基於elasticsearch2.x版本的,並不是5.x版本,而且還有好多是錯的,拿過來根本不能直接用來測試,還有就是spring-data沒有

5月11日 python學習總結 子查詢、pymysql模塊刪改、防止sql註入問題

hal port 註入 any dict lex absolut username 參數 一、子查詢    子查詢:把一個查詢語句用括號括起來,當做另外一條查詢語句的條件去用,稱為子查詢 select emp.name from emp inner join dep on

使用EF框架實現刪改操作

EF框架 增刪改查1:添加數據第二種方式:2:刪除數據3:修改數據4:查詢數據查詢所有的數據:查詢部分數據使用EF框架實現增刪改查操作

Mock.js簡易教程,脫離後端獨立開發,實現刪改功能

定義 數據 false 則表達式 type break 整數 增 刪 改 查 大於 在我們的生產實際中,後端的接口往往是較晚才會出來,並且還要寫接口文檔,於是我們的前端的許多開發都要等到接口給我們才能進行,這樣對於我們前端來說顯得十分的被動,於是有沒有可以制造假數據來模擬後

SOD框架的Model、連接數據庫及刪改

type use protect ase details password delet tab ali using PWMIS.DataMap.Entity; using System; using System.Collections.Generic; using Sy

MyBatis框架入門小案例(關於用mybatis框架對數據庫的刪改

throw gets ioe ssa 靜態代碼塊 文件 boolean 實現 where 1.新建一個maven項目,建好相對應的包,在https://mvnrepository.com中導入MyBatis需要的依賴,復制到配置文件中 2.在resources文件下