当前位置: 首页>后端>正文

python3 sqlalchemy 多个查询条件 flask sqlalchemy多条件查询

flask筛选数据

添加多条学生信息

  • s_list = [学生对象1, 学生对象2,..]
  • db.session.add_all(s_list)

运算符

  • filter(模型名.字段.运算符(‘xxx’))
  • filter(模型名.字段 运算符 值 )
  • 运算符
  • lt 小于
  • le 小于等于
  • gt 大于
  • ge 大于等于
  • in_ 在范围内
  • order_by 排序
  • limit 截取几个信息
  • offset 跳过几个信息
  • get 获取主键对应的信息
  • and_ 并且条件
  • or_ 或者条件
  • not_ 非
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()


class Student(db.Model):

    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(20), unique=True)
    s_age = db.Column(db.Integer, default=18)

    __tablename__ = 'student'

    # 初始化,通过这种方式就可以直接通过传参数的方式,创建数据
    def __init__(self, name, age):

        self.s_name = name
        self.s_age = age
import random

from flask import Blueprint, render_template, request
# 注意导入的包
from sqlalchemy import and_, or_, not_

from Stu.models import db, Student

stu = Blueprint('stu', __name__)


@stu.route('/')
def index():
    return render_template('index.html')


@stu.route('/createdb')
def create_db():
    db.create_all()
    return '创建数据库成功'


@stu.route('/dropdb')
def drop_db():
    db.drop_all()
    return '删除数据库成功,可以跑路了'


@stu.route('/createstu', methods=['GET', 'POST'])
def create_stu():
    if request.method == 'GET':
        return render_template('create_stu.html')

    if request.method == 'POST':
        username1 = request.form.get('username1')
        age1 = request.form.get('age1')
        stus = Student(username1, age1)

        db.session.add(stus)
        db.session.commit()
        return '创建成功'


@stu.route('/createstus', methods=['GET', 'POST'])
def create_stus():
    if request.method == 'GET':
        return render_template('create_stu.html')

    else:
        stus_list =[]
        username1 = request.form.get('username1')
        age1 = request.form.get('age1')

        username2 = request.form.get('username2')
        age2 = request.form.get('age2')

        stu1 = Student(username1, age1)
        stu2 = Student(username2, age2)

        stus_list.append(stu1)
        stus_list.append(stu2)
        # 注意传送的是一个列表,添加的方式也有变化,add_all
        db.session.add_all(stus_list)
        db.session.commit()
        return '添加成功'


@stu.route('/selectstu')
def select_stu():
    # 年龄小于16岁的学生信息
    # stus = Student.query.filter(Student.s_age < 16)

    # 也可以用这种方法lt 小于, le小于等于
    # stus = Student.query.filter(Student.s_age.__lt__(16))

    # 小于等于16
    # stus = Student.query.filter(Student.s_age.__le__(16))

    # 大于16
    # tus = Student.query.filter(Student.s_age.__gt__(16))

    # 大于等于16
    # stus = Student.query.filter(Student.s_age.__ge__(16))

    # 年龄在16,1,20, 23
    # stus = Student.query.filter(Student.s_age.in_([16, 1, 20, 23]))

    # 原生sql查所有学生
    # sql = 'select * from student'
    # stus = db.session.execute(sql)

    # 按照id降序排列,注意是在query后面接order_by,如果加了all取到的是一个列表,没有order_by方法
    # stus = Student.query.order_by('-s_id')

    # 降序获取3个
    # stus = Student.query.order_by('-s_id').limit(3)

    # 获取年龄最大的一个
    # stus = Student.query.order_by('-s_age').limit(1)

    # 跳过2个数据,取两个
    # stus = Student.query.order_by('-s_age').offset(2).limit(2)

    # 获取s_id等于24的学生
    # stus = Student.query.filter(Student.s_id == 24).all()

    # get方法,只会匹配主键,并且取到的是一个值,不能被迭代
    # stu = Student.query.get(24)

    # 查询多个条件
    # stus = Student.query.filter(Student.s_age == 20, Student.s_name == '关羽').all()

    # and_并且条件
    # stus = Student.query.filter(and_(Student.s_age == 18, Student.s_name == '刘备'))

    # or_或者条件
    # stus = Student.query.filter(or_(Student.s_age == 18,Student.s_name == '刘备'))

    # not_非 只能加一个条件
    # stus = Student.query.filter(not_(Student.s_age == 18))

    # 表示年龄不等于18, 姓名是关羽的数据
    # stus = Student.query.filter(not_(Student.s_age == 18), (Student.s_name == '关羽'))

    return render_template('student_list.html', stus=stus)


@stu.route('/createstubyrange')
def create_random_stus():
    stus_list = []
    for i in range(20):
        stu = Student('小明%d' % random.randrange(1000),
                '%d' % random.randrange(30))
        stus_list.append(stu)
    db.session.add_all(stus_list)
    db.session.commit()
    return '创建成功'

分页

  • paginate对象
  • pages 总页数
  • total 总条数
  • has_prev 是否有上页
  • has_next 是否有下页
  • prev_num
  • next_num
  • iter_pages() 当前一共多少页[1,2,3]
@stu.route('/stupage')
def stu_page():
    # 获取当前页数
    page = int(request.args.get('page', 1))
    # 设置每页数据
    per_page = int(request.args.get('per_page', 10))
    # 将学生数据分页
    paginate = Student.query.order_by('-s_id').paginate(page, per_page, error_out=False)
    # 获取学生信息
    stus = paginate.items
    return render_template('stupage.html', paginate=paginate, stus=stus)
{% extends 'base_main.html' %}

{% block title %}
    学生分页页面
{% endblock %}

{% block content %}
    <h3>学生信息</h3>
    {% for stu in stus %}
        {{ stu.s_name }}
        {{ stu.s_age }}
        <br>
    {% endfor %}
    <br>
    总页数:{{ paginate.pages }}
    <br>
    一共有{{ paginate.total }}条数据
    <br>

    当前页数:{{ paginate.page }}
    <br>
    {% if paginate.has_prev %}
        <a href=" /stu/stupage?page={{ paginate.prev_num }} ">上一页:{{ paginate.prev_num }}</a>
    {% endif %}
    {% if paginate.has_next %}
        <a href=" /stu/stupage?page={{ paginate.next_num }} ">下一页:{{ paginate.next_num }}</a>
    {% endif %}
    <br>
    页码:{% for i in  paginate.iter_pages() %}
    <a href="/stu/stupage?page={{ i }}"> {{ i }} </a>
    {% endfor %}
{% endblock %}

one_to_many

  • 在one的model中定义relationship字段
  • students = db.relationship(‘Student’, backref=’stu’, lazy=True)
  • 通过one找many,one的对象.students,结果为many的结果
  • 通过many找one,many的对象.stu,结果为one的对象
# Grade app下的models.py文件
from datetime import datetime

from flask_sqlalchemy import SQLAlchemy
# 注意为了是两个表可以互相关联需要从另一model中导入db
from Stu.models import db


class Grade(db.Model):

    g_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    g_name = db.Column(db.String(10), unique=True)
    g_desc = db.Column(db.String(100), nullable=True)
    g_time = db.Column(db.Date, default=datetime.now)
    # 在没有设置外键的表中,设置关系,第一个参数是另一model的类名,第二参数用于反向查找这个表
    # lazy懒加载,使用的时候才加载
    students = db.relationship('Student', backref='grade', lazy=True)  

    __tablename__ = 'grade'

    def __init__(self, name, desc):
        self.g_name=name
        self.g_desc=desc
# Stu app下的models.py文件
from flask_sqlalchemy import SQLAlchemy


db = SQLAlchemy()


class Student(db.Model):

    s_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(20), unique=True)
    s_age = db.Column(db.Integer, default=18)
    # 注意参数顺序,不要写反, grade.g_id表示的是tablename,点关联的字段名
    # 在通过这个表找关联表时不要直接点s_g,需要点上一个model中的反选的变量(grade)
    s_g = db.Column(db.Integer, db.ForeignKey('grade.g_id'), nullable=True)

    __tablename__ = 'student'

    # 初始化
    def __init__(self, name, age):

        self.s_name = name
        self.s_age = age
# Stu app下的views.py文件
@stu.route('/selectgradebystu/<int:id>/')
def select_grade_by_stu(id):
    # 通过id找到学生
    stu = Student.query.get(id)
    # 学生通过反选变量找到班级
    grade = stu.grade

    return render_template('stu_grade.html', stu=stu, grade=grade)
# Grade app下的views.py文件
@grade.route('/selectstubygrade/<int:id>/' )
def select_stu_by_grade(id):
    # 通过班级id找到班级
    grade = Grade.query.get(id)
    # 通过班级的关联字段找到学生
    stus = grade.students
    # 通过反选变量还可以找到班级
    grade1 = stus[0].grade
    return render_template('grade_student.html', stus=stus, grade=grade, grade1=grade1)



https://www.xamrdz.com/backend/3e41962934.html

相关文章: