模型:
# 根據現有的表結構構建模型類
class Users(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True)
age = db.Column(db.Integer)
email = db.Column(db.String(120),unique=True)
def __init__(self,username,age,email):
self.username = username
self.age = age
self.email = email
def __repr__(self):
return "<Users %r>" % self.username
插入
具體信息在上一篇博客
# 強制刪除所有模型對應的表
db.drop_all()
# 將所有模型映射到數據庫
db.create_all()
# 向表中插入一條記錄
@app.route('/insert')
def insert_views():
user = Users('Paris',18,'[email protected]')
db.session.add(user)
return "Insert OK"
FlASK-SQLAlchmey 查詢:
基於db.session 進行查詢
db.session.query()
可以有多個參數,參數表示要查詢那個實體
該函數會返回一個query對象 包含了指定實體類對應的表中所有的數據
查詢執行函數:
在查詢的基礎上得到最終想要的結果
語法:
db.session.query(...).查詢執行函數
all()
以列表的方式返回查詢的所有結果
first()
返回查詢結果中的第一個結果 沒有返回None
first_or_404()
返回查詢第一個結果如果沒有終止並返回404
count()
返回查詢結果的數量
過濾器函數:
filter()
按照指定條件進行過濾(多表,單表,定值,不定值)
filter_by()
按照等值條件進行過濾
limit()
按照限制行數獲取查詢結果
order_by()
按照指定條件進行排序
group_by()
根據指定條件進行分組
示例:
查詢所有 年齡大於30的信息
db.session.query(Users).filter(Users.age>30).all()
條件必須有模型.屬性 來組成
查詢所有 年齡大於30或者id大於5的信息
要藉助於 or_() 函數
db.session.query(Users).filter(or_(Users.age>30, Users.id>5)).all()
查詢所有 年齡大於30並且小於50的信息
db.session.query(Users).filter(Users.age>30, Users.age<50).all()
查詢所有 年齡等於30 的信息
db.session.query(Users).filter(Users.id==5).all()
查詢所有 username中含有“w”的用戶信息
db.session.query(Users).filter(Users.username.like("%w%")).all()
查詢所有 id在 1~3之間的user信息
要藉助於 in_() 函數
db.session.query(Users).filter(Users.id.in_([1, 2, 3])).all()
查詢id=5的信息
db.session.query(Users).filter_by(id=5).first()
獲取前5條數據
db.session.query(Users).limit(5).all()
獲取從2開始的前5條數據
db.session.query(Users).limit(5).offset(2).all()
對Users表中按照id倒敘排序
db.session.query(Users).order_by("id desc").all()
多級排序逗號隔開
db.session.query(Users).order_by("id desc, age asc").all()
基於Models 進行查詢
Models.query.查詢過濾器(條件參數).查詢執行函數
Users.query.filter(Users.id>3).all()
# 查詢路由
@app.route('/query')
def query_views():
# 測試查詢
print(db.session.query(Users))
print(db.session.query(Users.username,Users.email))
print(db.session.query(Users,Course))
# 通過查詢執行函數獲得最終查詢結果
# all() : 得到查詢中所有的結果
users = db.session.query(Users).all()
for u in users:
print(u.username,u.age,u.email)
# first() : 得到查詢中的第一個結果
user = db.session.query(Users).first()
print(user.username,user.age,user.email)
course = db.session.query(Course).first()
print(course)
# 使用查詢過濾器函數對數據進行篩選
# 查詢年齡大於30的Users的信息
users = db.session.query(Users).filter(Users.age>30).all()
print(users)
# 查詢年齡大於30並且id大於5的Users的信息
users = db.session.query(Users).filter(Users.age>30,Users.id > 5).all()
print(users)
# 查詢年齡大於30 或者 id大於 5 的Users的信息
users = db.session.query(Users).filter(or_(Users.age>30,Users.id > 5)).all()
print(users)
# 查詢email中包含字符'w'的用戶的信息
users = db.session.query(Users).filter(Users.email.like('%w%')).all()
print(users)
# 查詢id在1,2,3 之間的 用戶的信息
users = db.session.query(Users).filter(Users.id.in_([1,2,3])).all()
print(users)
# 查詢 Users 表中所有數據的前3條
users = db.session.query(Users).limit(3).all()
users = db.session.query(Users).limit(3).offset(1).all()
# 查詢Users表中所有的數據,並按照id倒敘排序
users = db.session.query(Users).order_by('id desc,age asc')
print(users)
# 查詢Users表中所有的數據,並按照 age 進行分組
users = db.session.query(Users).group_by('id').all()
print(users)
# 基於Models實現的查詢 : 查詢id>3的所有用戶的信息
users = Users.query.filter(Users.id>3).all()
print(users)
return "Query OK"
FLASK-SQLAlchemy 刪除 和 修改
刪除:
1.查詢出要刪除的實體
user = db.session.query(Users).filter_by(id=5).first()
2.根據所提供的刪除方法將信息刪除
db.session.delete(user)
@app.route('/delete_user')
def delete_user():
# 查詢並去除id=5的第一條記錄
user = Users.query.filter_by(id=5).first()
# 將改記錄刪除
db.session.delete(user)
return 'Delete OK'
修改:
1.查
user = Users.query.filter_by(id=1).first()
2.改
user.username = "巴黎"
3.保存
db.session.add(user)
@app.route('/update_user')
def update_user():
# 查詢id=1的第一條記錄並取出
user = Users.query.filter_by(id=1).first()
# 將username改爲巴黎
user.username = "巴黎"
# 將年齡改爲17
user.age = 17
# 將數據重新插入回數據庫 如果該數據純在則更新如果不存在則創建
db.session.add(user)
return "Update OK"
FLASK-SQLAlchemy - 關係映射
一對多:
在“多”實體中增加
外鍵類名 = db.Column(db.Integer, db.ForeignKey(主表.主鍵))
在“一”的實體中正價反向引用關係
屬性名 = db.relationship(“對應的“多”實體類名”, backref="屬性名", lazy="dynamic")
class Course(db.Model):
__tablename__ = "course"
id = db.Column(db.Integer,primary_key=True)
cname = db.Column(db.String(30))
#反向引用:
# 返回與當前課程相關的teacher列表
#backref:
# 定義反向關係,本質上會向Teacher實體中增加一個
# course屬性.該屬性可替代course_id來訪問
# Course模型.此時獲得到的是模型對象,而不是外鍵值
teachers=db.relationship('Teacher',backref='course')
def __init__(self,cname):
self.cname = cname
class Teacher(db.Model):
__tablename__='teacher'
id = db.Column(db.Integer,primary_key=True)
tname = db.Column(db.String(30))
tage = db.Column(db.Integer)
# 增加一列 : course_id,外鍵列,要引用自主鍵表(course)的主鍵列(id)
course_id = db.Column(db.Integer,db.ForeignKey('course.id'))
def __init__(self,tname,tage):
self.tname = tname
self.tage = tage
def __repr__(self):
return "<Teacher %r>" % self.tname