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](https://i-blog.csdnimg.cn/blog_migrate/21b2ed9db94aee5f163fd02c3dd705aa.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](https://i-blog.csdnimg.cn/blog_migrate/cd48396d667b0bf636657f3bc847ba61.png)
页面截图
![20155953-285572a8a8974e75.png](https://i-blog.csdnimg.cn/blog_migrate/de19e995895bfff777f581f3299e8712.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()