当前位置:   article > 正文

flask-sqlalchemy快速上手_flask 课程表

flask 课程表

一、前言

本篇依然是面向有一定经验的开发者。本篇不会讲原理,一切以实用为主。

本篇主要讲述以下内容:

  • flask-sqlalchemy的搭建
  • 简单查询
  • 查询指定字段
  • 排序
  • 分页
  • 聚合函数
  • 连表查询
  • 修改
  • 删除

 

二、flask-sqlalchemy练习环境准备

1.准备好我们要用的数据,这里我使用的是mysql

  1. --建表
  2. --学生表
  3. CREATE TABLE `Student`(
  4. `s_id` VARCHAR(20),
  5. `s_name` VARCHAR(20) NOT NULL DEFAULT '',
  6. `s_birth` VARCHAR(20) NOT NULL DEFAULT '',
  7. `s_sex` VARCHAR(10) NOT NULL DEFAULT '',
  8. PRIMARY KEY(`s_id`)
  9. );
  10. --课程表
  11. CREATE TABLE `Course`(
  12. `c_id` VARCHAR(20),
  13. `c_name` VARCHAR(20) NOT NULL DEFAULT '',
  14. `t_id` VARCHAR(20) NOT NULL,
  15. PRIMARY KEY(`c_id`)
  16. );
  17. --教师表
  18. CREATE TABLE `Teacher`(
  19. `t_id` VARCHAR(20),
  20. `t_name` VARCHAR(20) NOT NULL DEFAULT '',
  21. PRIMARY KEY(`t_id`)
  22. );
  23. --成绩表
  24. CREATE TABLE `Score`(
  25. `s_id` VARCHAR(20),
  26. `c_id` VARCHAR(20),
  27. `s_score` INT(3),
  28. PRIMARY KEY(`s_id`,`c_id`)
  29. );
  30. --插入学生表测试数据
  31. insert into Student values('01' , '赵雷' , '1990-01-01' , '男');
  32. insert into Student values('02' , '钱电' , '1990-12-21' , '男');
  33. insert into Student values('03' , '孙风' , '1990-05-20' , '男');
  34. insert into Student values('04' , '李云' , '1990-08-06' , '男');
  35. insert into Student values('05' , '周梅' , '1991-12-01' , '女');
  36. insert into Student values('06' , '吴兰' , '1992-03-01' , '女');
  37. insert into Student values('07' , '郑竹' , '1989-07-01' , '女');
  38. insert into Student values('08' , '王菊' , '1990-01-20' , '女');
  39. --课程表测试数据
  40. insert into Course values('01' , '语文' , '02');
  41. insert into Course values('02' , '数学' , '01');
  42. insert into Course values('03' , '英语' , '03');
  43. --教师表测试数据
  44. insert into Teacher values('01' , '张三');
  45. insert into Teacher values('02' , '李四');
  46. insert into Teacher values('03' , '王五');
  47. --成绩表测试数据
  48. insert into Score values('01' , '01' , 80);
  49. insert into Score values('01' , '02' , 90);
  50. insert into Score values('01' , '03' , 99);
  51. insert into Score values('02' , '01' , 70);
  52. insert into Score values('02' , '02' , 60);
  53. insert into Score values('02' , '03' , 80);
  54. insert into Score values('03' , '01' , 80);
  55. insert into Score values('03' , '02' , 80);
  56. insert into Score values('03' , '03' , 80);
  57. insert into Score values('04' , '01' , 50);
  58. insert into Score values('04' , '02' , 30);
  59. insert into Score values('04' , '03' , 20);
  60. insert into Score values('05' , '01' , 76);
  61. insert into Score values('05' , '02' , 87);
  62. insert into Score values('06' , '01' , 31);
  63. insert into Score values('06' , '03' , 34);
  64. insert into Score values('07' , '02' , 89);
  65. insert into Score values('07' , '03' , 98);

2.搭建flask-sqlalchemy环境

首先把flask和flask-sqlalchemy都装上

pip install flask

pip install flask-sqlalchemy

新建configs.py:

  1. SQLALCHEMY_DATABASE_URI = "mysql://用户名:密码@数据库地址/数据库名称?charset=utf8"
  2. SQLALCHEMY_TRACK_MODIFICATIONS = True

新建程序入口main.py,并编写对应表的model:

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3. # 创建Flask应用
  4. app = Flask(__name__)
  5. # 加载配置文件
  6. app.config.from_object("configs")
  7. # 创建sqlalchemy对象
  8. db = SQLAlchemy(app)
  9. class Student(db.Model):
  10. """
  11. 学生表
  12. """
  13. __tablename__ = "Student"
  14. s_id = db.Column(db.String(20), primary_key=True)
  15. s_name = db.Column(db.String(20), nullable=False, default="")
  16. s_birth = db.Column(db.String(20), nullable=False, default="")
  17. s_sex = db.Column(db.String(10), nullable=False, default="")
  18. class Course(db.Model):
  19. """
  20. 课程表
  21. """
  22. __tablename__ = "Course"
  23. c_id = db.Column(db.String(20), primary_key=True)
  24. c_name = db.Column(db.String(20), nullable=False, default="")
  25. t_id = db.Column(db.String(20), nullable=False, default="")
  26. class Teacher(db.Model):
  27. """
  28. 教师表
  29. """
  30. __tablename__ = "Teacher"
  31. t_id = db.Column(db.String(20), primary_key=True)
  32. t_name = db.Column(db.String(20), nullable=False, default="")
  33. class Score(db.Model):
  34. """
  35. 成绩表
  36. """
  37. __tablename__ = "Score"
  38. s_id = db.Column(db.String(20), primary_key=True)
  39. c_id = db.Column(db.String(20), nullable=False, default="")
  40. s_score = db.Column(db.Integer)
  41. if __name__ == '__main__':
  42. pass

三、简单查询

1.查询所有学生,并打印姓名、性别

  1. if __name__ == '__main__':
  2. # 查询所有学生,并打印其名称
  3. students = Student.query.all()
  4. for student in students:
  5. print(student.s_name,student.s_sex)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 赵雷 男
  3. 钱电 男
  4. 孙风 男
  5. 李云 男
  6. 周梅 女
  7. 吴兰 女
  8. 郑竹 女
  9. 王菊 女
  10. Process finished with exit code 0

 

2.查询所有女生,并打印姓名、性别

  1. # 查询所有女生,并打印姓名、性别
  2. students = Student.query.filter(Student.s_sex == "女")
  3. for student in students:
  4. print(student.s_name, student.s_sex)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 周梅 女
  3. 吴兰 女
  4. 郑竹 女
  5. 王菊 女
  6. Process finished with exit code 0

3.查询性别为“男”,生日为“1990”开头的学生,并打印姓名、性别、生日

  1. # 查询性别为“男”,生日为“1990”开头的学生,并打印姓名、性别、生日
  2. students = Student.query.filter(Student.s_sex == "男", Student.s_birth.startswith("1990"))
  3. for student in students:
  4. print(student.s_name, student.s_sex, student.s_birth)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 赵雷 男 1990-01-01
  3. 钱电 男 1990-12-21
  4. 孙风 男 1990-05-20
  5. 李云 男 1990-08-06
  6. Process finished with exit code 0

4.查询姓名为“赵雷”的单个对象

  1. # 查询姓名为“赵雷”的单个对象
  2. student = Student.query.filter(Student.s_name == "赵雷").first()

5.查询姓名为“赵雷”或者“李云”的学生

  1. # 查询姓名为“赵雷”或者“李云”的学生
  2. from sqlalchemy import or_
  3. students = Student.query.filter(
  4. or_(
  5. Student.s_name == "赵雷",
  6. Student.s_name == "李云"
  7. )
  8. )
  9. for student in students:
  10. print(student.s_name, student.s_sex, student.s_birth)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 赵雷 男 1990-01-01
  3. 李云 男 1990-08-06
  4. Process finished with exit code 0

四、查询指定字段

有时候我们并不需要一次性查询出所有字段,为了提高性能,我们可以查询指定字段

1.只查询学生的姓名

  1. # 只查询学生的姓名
  2. students = Student.query.with_entities(
  3. Student.s_name
  4. ).all()
  5. for student in students:
  6. print(student.s_name)

2.给字段取别名

  1. # 给字段取别名
  2. students = Student.query.with_entities(
  3. Student.s_name.label("name")
  4. ).all()
  5. for student in students:
  6. print(student.name)

五、排序

1.按生日正序排序

  1. # 按生日正序排序
  2. students = Student.query.order_by(Student.s_birth.asc())
  3. for student in students:
  4. print(student.s_name, student.s_sex, student.s_birth)

2.按生日倒序排序

  1. # 按生日倒序排序
  2. students = Student.query.order_by(Student.s_birth.desc())
  3. for student in students:
  4. print(student.s_name, student.s_sex, student.s_birth)

六、分页

sqlalchemy分页可以直接用python的切片语法,相当于sql的limit

1.按生日倒序排序后,查询前5个学生

  1. # 按生日倒序排序后,查询前5个学生
  2. students = Student.query.order_by(Student.s_birth.desc())[0:5]
  3. for student in students:
  4. print(student.s_name, student.s_sex, student.s_birth)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 吴兰 女 1992-03-01
  3. 周梅 女 1991-12-01
  4. 钱电 男 1990-12-21
  5. 李云 男 1990-08-06
  6. 孙风 男 1990-05-20
  7. Process finished with exit code 0

七、聚合函数

1.查询Score表中c_id="01"的平均分

  1. from sqlalchemy import func
  2. # 查询Score表中c_id="01"的平均分
  3. avg_score = Score.query.with_entities(
  4. func.avg(Score.s_score)
  5. ).filter(
  6. Score.c_id == "01"
  7. ).scalar()
  8. print(avg_score)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 64.5000
  3. Process finished with exit code 0

2.查询Score表中s_id="01"的总分

  1. # 查询Score表中s_id="01"的总分
  2. sum_score = Score.query.with_entities(
  3. func.sum(Score.s_score)
  4. ).filter(
  5. Score.s_id == "01"
  6. ).scalar()
  7. print(sum_score)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 269
  3. Process finished with exit code 0

其他聚合函数的用法类似,我就不一一列举了

八、连表查询

1.查询每条Score对应的学生姓名、老师姓名、课程名

  1. # 查询每条Score对应的学生姓名、老师姓名、课程名
  2. qs = Score.query.with_entities(
  3. Score.s_score,
  4. Student.s_name,
  5. Teacher.t_name,
  6. Course.c_name
  7. ).join(
  8. Student, Student.s_id == Score.s_id
  9. ).join(
  10. Course, Course.c_id == Score.c_id
  11. ).join(
  12. Teacher, Teacher.t_id == Course.t_id
  13. )
  14. for record in qs:
  15. print(record.s_score, record.s_name, record.t_name, record.c_name)

运行结果:

  1. D:\softwave\python38\python.exe D:/work/flask_demo/main.py
  2. 80 赵雷 李四 语文
  3. 90 赵雷 张三 数学
  4. 99 赵雷 王五 英语
  5. 70 钱电 李四 语文
  6. 60 钱电 张三 数学
  7. 80 钱电 王五 英语
  8. 80 孙风 李四 语文
  9. 80 孙风 张三 数学
  10. 80 孙风 王五 英语
  11. 50 李云 李四 语文
  12. 30 李云 张三 数学
  13. 20 李云 王五 英语
  14. 76 周梅 李四 语文
  15. 87 周梅 张三 数学
  16. 31 吴兰 李四 语文
  17. 34 吴兰 王五 英语
  18. 89 郑竹 张三 数学
  19. 98 郑竹 王五 英语
  20. Process finished with exit code 0

九、修改

1.把赵雷的名字改成赵日天

  1. # 把赵雷的名字改为赵日天
  2. student_sz = Student.query.filter(Student.s_name == "赵雷").first()
  3. student_sz.s_name = "赵日天"
  4. db.session.commit()

十、删除

1.把赵日天删除

  1. # 把赵日天删除
  2. student_sz = Student.query.filter(Student.s_name == "赵日天").first()
  3. db.session.delete(student_sz)
  4. db.session.commit()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/510787
推荐阅读
相关标签
  

闽ICP备14008679号