模型:
# 根据现有的表结构构建模型类
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,'Paris@gmail.com')
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