
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
flask SQLAlchemy
學号
姓名
城市
位址
電話
操作
{% for j in result %}
{{ j.id }}
{{ j.name }}
{{ j.city }}
{{ j.addr }}
{{ j.tel }}
{% endfor %}
輸入新生資訊:
學号:
姓名:
城市:
位址:
電話: