1. 程式人生 > 其它 >flask orm 資料庫_Python之Flask_SQLAlchemy

flask orm 資料庫_Python之Flask_SQLAlchemy

技術標籤:flask orm 資料庫

0f606e14918f1e547121271041a1ae99.gif

Web應用中普遍使用的是關係模型的資料庫,關係型資料庫把所有的資料都儲存在表中,表用來給應用的實體建模,表的列數是固定的,行數是可變的。它使用結構化的查詢語言。關係型資料庫的列定義了表中表示的實體的資料屬性。比如:商品表裡有name、price、number等。 Flask本身不限定資料庫的選擇,你可以選擇SQL或NOSQL的任何一種。也可以選擇更方便的SQLALchemy,類似於Django的ORM。SQLALchemy實際上是對資料庫的抽象,讓開發者不用直接和SQL語句打交道,而是通過Python物件來操作資料庫,在捨棄一些效能開銷的同時,換來的是開發效率的較大提升。 SQLAlchemy是一個關係型資料庫框架,它提供了高層的ORM和底層的原生資料庫的操作。flask_sqlalchemy是一個簡化了SQLAlchemy操作的flask擴充套件。 使用flask_sqlalchemy擴充套件操作資料庫,首先需要建立資料庫連線。資料庫連線通過URL指定,而且程式使用的資料庫必須儲存到Flask配置物件的SQLALCHEMY_DATABASE_URI鍵中。 Flask資料庫配置:
app.config['SQLALCHEMY_DATABASE_URI']= 'mysql://root:[email protected]:3306/test3'
常用的SQLAlchemy欄位型別:

型別名

python中型別

說明

Integer

int

普通整數,一般是32位

SmallInteger

int

取值範圍小的整數,一般是16位

BigInteger

int或long

不限制精度的整數

Float

float

浮點數

Numeric

decimal.Decimal

普通整數,一般是32位

String

str

變長字串

Text

str

變長字串,對較長或不限長度的字串做了優化

Unicode

unicode

變長Unicode字串

UnicodeText

unicode

變長Unicode字串,對較長或不限長度的字串做了優化

Boolean

bool

布林值

Date

datetime.date

時間

Time

datetime.datetime

日期和時間

LargeBinary

str

二進位制檔案

常用的SQLAlchemy列選項:

選項名說明
primary_key如果為True,代表表的主鍵
unique如果為True,代表這列不允許出現重複的值
index如果為True,為這列建立索引,提高查詢效率
nullable如果為True,允許有空值,如果為False,不允許有空值
default為這列定義預設值

常用的SQLAlchemy關係選項:

選項名

說明

backref

在關係的另一模型中新增反向引用

primary join

明確指定兩個模型之間使用的聯合條件

uselist

如果為False,不使用列表,而使用標量值

order_by

指定關係中記錄的排序方式

secondary

指定多對多中記錄的排序方式

secondary join

在SQLAlchemy中無法自行決定時,指定多對多關係中的二級聯結條件

在flask_sqlalchemy中增刪改查操作,均由資料庫會話管理。會話用db.session表示。在準備把資料寫入資料庫前,要先將資料新增到會話中然後呼叫commit()方法提交會話。 資料庫會話是為了保證資料的一致性,避免因部分更新導致資料不一致。提交操作把會話物件全部寫入資料庫,如果寫入過程發生錯誤,整個會話都會失效。 資料庫會話也可以回滾,通過db.session.rollback()方法,實現會話提交資料前的狀態。 在flask_sqlalchemy中,查詢操作是通過query物件操作資料。最基本的查詢是返回表中所有資料,可以通過過濾器進行更精確的資料庫查詢。 下面是使用flask_sqlalchemy實現的學生資訊的增刪改查:
MySQL 版本:8.0.12MySQL Community Server – GPL
db_file.py
from flask import Flaskfrom flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:[email protected]/wcp"# 上面配置報1366 字符集warning 安裝mysql-connector-python,使用下面配置app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:[email protected]/wcp"# 追蹤物件的修改並且傳送訊號。這需要額外的記憶體, 如果不必要的可以禁用它。app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False# 設定每次請求結束後會自動提交資料庫中的改動app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True  # app.config['SQLALCHEMY_ECHO'] = True  # 查詢時會顯示原始SQL語句db = SQLAlchemy(app)class students(db.Model):    __tablename__ = 'students'  # 指明表名,預設與類相同    id = db.Column('student_id', db.Integer, primary_key=True)    name = db.Column(db.String(100))    city = db.Column(db.String(50))    addr = db.Column(db.String(200))    tel = db.Column(db.String(11))    def __repr__(self):        return 'id:{} name:{} city:{} addr:{} tel:{}'.format(self.id,self.name,self.city,self.addr,self.tel)

WC_public_flask.py

from flask importrender_template, requestfrom db_file importapp,db,[email protected]('/',methods=['GET','POST'])def hello():    # print(request.method)    if request.method== 'GET':        data = students.query.all()        return render_template('index.html',result= data)    elif request.method== 'POST':        id = request.form['id']        name = request.form['name']        city = request.form['city']        addr = request.form['addr']        tel = request.form['tel']        user = students(id=id,name=name,city=city,addr=addr,tel=tel)        db.session.add(user)        db.session.commit()        data = students.query.all()        return render_template('index.html',result= data)@app.route('/delurl',methods=['POST'])def delfun():    delobj = request.form['del']    user = students.query.filter_by(id=delobj).first()    db.session.delete(user)    db.session.commit()    data = students.query.all()    return render_template('index.html', result=data)if __name__ == '__main__':    db.create_all()    app.run(debug=True)
db.create_all()在執行程式時首先要建立表,防止表存在還可以先執行db._drop_all(),還要注意的是GET方法時要獲取前端資料要使用request.args.get(“name”),POST方法時要獲取前端資料要使用request.form[“name”]。

index.html

flaskSQLAlchemy
學號姓名城市地址電話操作{%forjinresult%}{{j.id}}{{j.name}}{{j.city}}{{j.addr}}{{j.tel}}{%endfor%}

輸入新生資訊:

學號:

姓名:

城市:

地址:

電話: