美文网首页
2.8.6Flask --6 Flask的模型层

2.8.6Flask --6 Flask的模型层

作者: 寒暄_HX | 来源:发表于2020-03-10 17:42 被阅读0次

Flask目录:https://www.jianshu.com/p/9b5e30320849

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()

数据类型一览

增删改查

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>
页面截图
页面截图

其他查询方法

查询过滤器 :

过滤器 说明
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()

相关文章

网友评论

      本文标题:2.8.6Flask --6 Flask的模型层

      本文链接:https://www.haomeiwen.com/subject/pnipdhtx.html