1. 程式人生 > 其它 >python Flask 操作資料庫 Flask資料庫

python Flask 操作資料庫 Flask資料庫

Flask資料庫 

轉載:Flask資料庫 - 苦行僧95 - 部落格園 (cnblogs.com)

Flask-SQLAlchemy

Flask-SQLAlchemy是在Flask中操作關係型資料庫的拓展。是以面向模型物件的形式操作資料庫,通過遷移完成建表

安裝第三方庫

pip install Flask-SQLAlchemy==2.2
pip install Flask-MySQLdb==0.2.0

基本配置

from flask_sqlalchemy import SQLAlchemy
# 配置資料庫訪問連結
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:[email protected]:3306/demo"
# 設定是否追蹤資料庫的增刪改查,一般設定為False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Flase
# 建立SQLAlchemy物件,,並與當前資料庫關聯,TCP連線
db = SQLAlchemy(app)

 

自定義模型

class Publishers(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    address = db.Column(db.String(64))

    def _str_(self):  # print顯示內容做設定
        return self.name

    def _repr__(self):  # 對列表中顯示內容做設定
        return self.name

對資料庫增刪改查

#第一種方法 
user = User(name="laowang", age=18)
    db.session.add(user)   # 邏輯新增
    db.session.commit()

#第二種方法
user = User()
user.name = "laoli"
user.age = 18
db.session.add(user)   # 邏輯新增
db.session.commit()

es = User.query.filter_by(name="laowang").first()
    db.session.delete(es)
    db.session.commit()

es = User.query.filter_by(id=3).first()
res.name="lisi"

模型類名.query.過濾器.查詢執⾏行行器器

 

過濾器

返回BaseQuery型別物件 並不是最終的資料 最終的資料由 查詢執行器獲取

filert()  按照條件查詢

比如:

User.quer.filter(User.name = "lisi")

filter_by()  按照條件精確查詢

比如:

User.query.filter_by(id=1)

查詢執行器

返回最終的結果

all()  返回查詢到的所有結果,是一個列表, User.query.filter(User.name != 'wang').all()

first()  返回查詢的第一個結果,User.query.filter(User.name != 'wang').first()

get()  返回主鍵對應的行, User.query.get(1)

count()  返回查詢結果的數量 User.query.count()

paginate()  引數分別對應的是要查詢的是第幾頁,每頁幾條資料,如果有錯是否輸出。 User.query.paginate(2, 3, False),這個例子是,每頁三條資料,查詢第二頁的資料

關於查詢的一些練習

排序

order_by()

例子:

# 正序
User.query.order_by(User.name)
# 倒序
User.query.order_by(User.name.desc())

 一對多關係

在說一對多關係的時候,用的是班級表和學生表,班級模型類:Class,學生模型類:Student

一查多

relationship

在一的那一方,建立跟多的那一方的關聯屬性

# 在班級模型類中定義
student = db.relationship("Student")
# 查詢 class = Class.query.get(1) class.student

多對多關係

多對多是通過建立中間表實現的。中間表值記錄關係和儲存關係欄位。

這個中間表將互為多對多的關係表的主鍵設為外來鍵。

這個關係表是直接建立的,不適用於模型類對映

 View Code

lazy屬性

在一對多查詢的時候,如果已經查詢出一的那一方,可以決定多的那一方資料查詢的時機,是在查出一後立即查出多的資料(預設),還是在使用的時候才去查詢。

設定查出一就同時查出多

student = db.relationship("Student", backref = "class", lazy = "subquery")

class = Class.query.get(1)

class.student

如例子中,lazy設定為subquery之後,class.student會顯示所有記錄。

設定用到多是再查多

student = db.relationship("Student", backref = "class", lazy = "dynamic")

class = Class.query.get(1)

class.student

如例子中,lazy設定為subquery之後,class.student不會顯示所有記錄,可以用class.student[0]這樣的下標取值。

Flask-SQLAlchemy

Flask-SQLAlchemy是在Flask中操作關係型資料庫的拓展。是以面向模型物件的形式操作資料庫,通過遷移完成建表

安裝第三方庫

pip install Flask-SQLAlchemy==2.2
pip install Flask-MySQLdb==0.2.0

基本配置

from flask_sqlalchemy import SQLAlchemy
# 配置資料庫訪問連結
app.config['SQLALCHEMY_DATABASE_URI']="mysql://root:[email protected]:3306/demo"
# 設定是否追蹤資料庫的增刪改查,一般設定為False
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Flase
# 建立SQLAlchemy物件,,並與當前資料庫關聯,TCP連線
db = SQLAlchemy(app)

 

自定義模型

class Publishers(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    address = db.Column(db.String(64))

    def _str_(self):  # print顯示內容做設定
        return self.name

    def _repr__(self):  # 對列表中顯示內容做設定
        return self.name

對資料庫增刪改查

#第一種方法 
user = User(name="laowang", age=18)
    db.session.add(user)   # 邏輯新增
    db.session.commit()

#第二種方法
user = User()
user.name = "laoli"
user.age = 18
db.session.add(user)   # 邏輯新增
db.session.commit()

es = User.query.filter_by(name="laowang").first()
    db.session.delete(es)
    db.session.commit()

es = User.query.filter_by(id=3).first()
res.name="lisi"

模型類名.query.過濾器.查詢執⾏行行器器

 

過濾器

返回BaseQuery型別物件 並不是最終的資料 最終的資料由 查詢執行器獲取

filert()  按照條件查詢

比如:

User.quer.filter(User.name = "lisi")

filter_by()  按照條件精確查詢

比如:

User.query.filter_by(id=1)

查詢執行器

返回最終的結果

all()  返回查詢到的所有結果,是一個列表, User.query.filter(User.name != 'wang').all()

first()  返回查詢的第一個結果,User.query.filter(User.name != 'wang').first()

get()  返回主鍵對應的行, User.query.get(1)

count()  返回查詢結果的數量 User.query.count()

paginate()  引數分別對應的是要查詢的是第幾頁,每頁幾條資料,如果有錯是否輸出。 User.query.paginate(2, 3, False),這個例子是,每頁三條資料,查詢第二頁的資料

關於查詢的一些練習

排序

order_by()

例子:

# 正序
User.query.order_by(User.name)
# 倒序
User.query.order_by(User.name.desc())

 一對多關係

在說一對多關係的時候,用的是班級表和學生表,班級模型類:Class,學生模型類:Student

一查多

relationship

在一的那一方,建立跟多的那一方的關聯屬性

# 在班級模型類中定義
student = db.relationship("Student")
# 查詢 class = Class.query.get(1) class.student

多對多關係

多對多是通過建立中間表實現的。中間表值記錄關係和儲存關係欄位。

這個中間表將互為多對多的關係表的主鍵設為外來鍵。

這個關係表是直接建立的,不適用於模型類對映

 View Code

lazy屬性

在一對多查詢的時候,如果已經查詢出一的那一方,可以決定多的那一方資料查詢的時機,是在查出一後立即查出多的資料(預設),還是在使用的時候才去查詢。

設定查出一就同時查出多

student = db.relationship("Student", backref = "class", lazy = "subquery")

class = Class.query.get(1)

class.student

如例子中,lazy設定為subquery之後,class.student會顯示所有記錄。

設定用到多是再查多

student = db.relationship("Student", backref = "class", lazy = "dynamic")

class = Class.query.get(1)

class.student

如例子中,lazy設定為subquery之後,class.student不會顯示所有記錄,可以用class.student[0]這樣的下標取值。