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 Codelazy屬性
在一對多查詢的時候,如果已經查詢出一的那一方,可以決定多的那一方資料查詢的時機,是在查出一後立即查出多的資料(預設),還是在使用的時候才去查詢。
設定查出一就同時查出多
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 Codelazy屬性
在一對多查詢的時候,如果已經查詢出一的那一方,可以決定多的那一方資料查詢的時機,是在查出一後立即查出多的資料(預設),還是在使用的時候才去查詢。
設定查出一就同時查出多
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]這樣的下標取值。