flask orm 資料庫_Python之Flask_SQLAlchemy
阿新 • • 發佈:2021-01-03
技術標籤:flask orm 資料庫
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中無法自行決定時,指定多對多關係中的二級聯結條件 |
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%}
輸入新生資訊:
學號:
姓名:
城市:
地址:
電話: