天天看點

sqlalchemy limit_Python之Flask_SQLAlchemy

sqlalchemy limit_Python之Flask_SQLAlchemy

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 %}

輸入新生資訊:

學号:

姓名:

城市:

位址:

電話: