2.8.6Flask --6 Flask的模型层

Flask目录:https://blog.csdn.net/qq_41106844/article/details/105554021

Flask-SQLAlchemy

什么是Flask-SQLAlchemy

官方手册
Flask-SQLAlchemy是flask的扩展,他集成了sqlalchemy用于操控数据库的ORM语法。让flask能够收放自如的操控数据库。
安装

python -m pip install Flask-SQLAlchemy

第一个例子

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
#连接数据库
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root: @127.0.0.1:3306/test_flasks'

#绑定flask对象
db = SQLAlchemy(app)
#ORM模型的创建
class User(db.Model):
    """用户ID"""
    __tablename__ = 'wei_user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(32),nullable=False)
    password = db.Column(db.String(32),nullable=False)
    birth_date = db.Column(db.Date,nullable=True)
    age = db.Column(db.Integer,default=0)

#新建表
db.create_all()

#删除表
db.drop_all()

@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run()

 
20155953-24c647b92d45d80c.png
数据类型一览

增删改查

from flask import Flask,render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
#连接数据库
app.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root: @127.0.0.1:3306/test_flasks'

#绑定flask对象
db = SQLAlchemy(app)
#ORM模型的创建
class User(db.Model):
    """用户ID"""
    __tablename__ = 'wei_user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(32),nullable=False)
    password = db.Column(db.String(32),nullable=False)
    birth_date = db.Column(db.Date,nullable=True)
    age = db.Column(db.Integer,default=0)


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

@app.route('/insert')
def insert():
    #实例化一条对象
    user = User(id=1,username='alex',password='123',birth_date='2020-01-01',age=20)
    #添加到数据库内
    db.session.add(user)
    #提交
    db.session.commit()
    #提交完成,删除这个连接。
    db.session.remove()
    return '添加成功'

@app.route('/update')
def update():
    user = User.query.filter(User.id == 3).first()
    user.username = 'zhangsan'
    db.session.commit()
    db.session.remove()
    return '修改成功'

@app.route('/delete')
def delete():
    user = User.query.filter(User.id == 2).first()
    db.session.delete(user)
    db.session.commit()
    db.session.remove()
    return '删除成功'

@app.route('/select')
def select():
    user_list = db.session.query(User).all()
    return render_template('ZSGC.html',user_list=user_list)


if __name__ == '__main__':
    app.run()
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <style>
        * {
            margin: 0;
            padding: 0
        }
        .head{
            line-height: 40px;
            background-color: green;
            color: white;
            text-align: center;

        }

    </style>
</head>
<body>

<div class="outer">
    <div class="head">标题</div>
    <div class="content">
        <a href="/insert">添加用户</a>
        <a href="/update">修改用户</a>
        <a href="/delete">删除用户</a>
        <a href="/select">查询用户</a>
    </div>
    <hr>
    <div class="queryResult">
         {% for user in user_list %}
         <div>
              <p>{{ user.username }} - {{ user.birth_date }} - {{ user.age }}</p>
         </div>
         {% endfor %}
    </div>
</div>

</body>
</html>
 
20155953-c0ea842997ba391f.png
页面截图

 

 
20155953-285572a8a8974e75.png
页面截图

 

其他查询方法

查询过滤器 :

过滤器说明
filter()把过滤器添加到原查询上, 返回一个新查询
filter_by()把等值过滤器添加到原查询上, 返回一个新查询
limit()使用是zing的值限制原查询返回的结果数量, 返回一个新查询
offset()偏移原查询返回的结果, 返回一个新查询
order_by()根据指定条件对原查询结果进行排序, 返回一个新查询
group_by()根据指定条件对原查询结果进行分组, 返回一个新查询

查询执行函数 :

方法说明
all()以列表形式返回查询的所有结果
first()返回查询的第一个结果,如果没有结果,则返回 None
first_or_404()返回查询的第一个结果,如果没有结果,则终止请求,返回 404 错误响应
get()返回指定主键对应的行,如果没有对应的行,则返回 None
get_or_404()返回指定主键对应的行,如果没找到指定的主键,则终止请求,返回 404
count()返回查询结果的数量
paginate()返回一个 Paginate 对象,它包含指定范围内的结果
    from sqlalchemy import and_,or_,not_
    from sqlalchemy.sql import func

    #普通查询
    user_list = db.session.query(User).all()
    user_list = db.session.query(User.username,User.age).all()
    #条件查询  查询用户名是alex的用户信息
    user_list = db.session.query(User).filter(User.username == 'alex').all()
    #模糊查询  查询用户名是 a 开头的用户信息
    user_list = db.session.query(User).filter(User.username.like('a%')).all()
    #多条件查询  and_  or_  not_
    user_list = db.session.query(User).filter(and_(User.username == 'alex',User.age < 20)).all()
    user_list = db.session.query(User).filter(or_(User.username == 'alex', User.age <20 )).all()
    user_list = db.session.query(User).filter(not_(User.username == 'alex')).all()
    #分页查询  每页三个,查询第二页
    user_list = db.session.query(User).all().paginate(2, 3)
    #查询排序  默认升序
    user_list = User.query.order_by(User.age).all()
    user_list = User.query.order_by(User.age.desc()).all()
    #分组查询
    user_list = db.session.query(func.max(User.id),
                                 func.count(User.id),
                                 func.sum(User.age).label('年龄总和'),
                                 ).group_by(User.birth_date).all()
    #分组查询 having
    user_list = db.session.query(func.max(User.id),
                                 func.count(User.id),
                                 func.sum(User.age).label('年龄总和'),
                                 ).group_by(User.birth_date).having(func.min(User.id) >2).all()

多表操作

一对多

class User(db.Model):
    """用户ID"""
    __tablename__ = 'wei_user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(32),nullable=False)
    password = db.Column(db.String(32),nullable=False)
    birth_date = db.Column(db.Date,nullable=True)
    age = db.Column(db.Integer,default=0)

class UserAddress(db.Model):
    """用户地址"""
    __tablename__ = 'wei_user_addr'
    id = db.Column(db.Integer,primary_key=True)
    addr = db.Column(db.String(64),nullable=False)

    #构建一对多的关系,外键在多的一方。
    user_id = db.Column(db.Integer,db.ForeignKey('wei_user.id'))
    #根据外键反选获取关联信息。
    user = db.relationship('User',backref=db.backref('address',lazy=True))

多对多

class User(db.Model):
    """用户ID"""
    __tablename__ = 'wei_user'
    id = db.Column(db.Integer,primary_key=True)
    username = db.Column(db.String(32),nullable=False)
    password = db.Column(db.String(32),nullable=False)
    birth_date = db.Column(db.Date,nullable=True)
    age = db.Column(db.Integer,default=0)

class Classname(db.Model):
    __tablename__ = 'wei_class'
    id = db.Column(db.Integer,primary_key=True)
    class_name = db.Column(db.String(64),nullable=False)

    class_user = db.Table('class_user',   #多对多表名
                           db.Column('User_id', db.Integer, db.ForeignKey('User.id'), primary_key=True),
                           db.Column('Classname_id', db.Integer, db.ForeignKey('Classname.id'), primary_key=True)
                           )

关联查询

    #关联查询
    user_list = db.session.query(User,Classname).filter(User.id == Classname.id).all()
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒 暄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值