数据库安装
Flask都是需要自己安装自己配置,数据库也不例外,因此需要安装
pip install flask-sqlalchemy
pip install pymysql
数据库配置
需要在配置app的文件下配,我们命名的是init文件
from flask_sqlalchemy import SQLAlchemy
# 配置链接数据库 用户密码主机等
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://用户名:密码@localhost(主机地址):3306/flask3'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
# 初始化app
SQLAlchemy(app=app)
除了主机地址是@别的都是:隔开
设置数据库内容
新建一个py文件,可以命名为models
用到的关键字参数有:
primary_key 主键
autoincrement 自增
unique 唯一
default 默认值
Integer 整形
String字符串
数据库名字:tablename
__tablename__ = 'student' 数据库名字
导入SQLALchemy
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'
创建,删除数据库
与Django不同的是,django是命令去创建,而Flask是调用函数去创建
引用modles里的db参数,通过create_all()创建
from Stu.models import db
# 创建数据库
@stu.route('/creat/')
def creat_table():
db.create_all()
return '成功'
通过drop_all()删除数据库
# 删除数据库
@stu.route('/del/')
def del_table():
db.drop_all()
return '删除成功'
数据库的增删改查(CDUR)
与Django不同的是flask的数据先是保存在缓存里面,需要用commit后才能上传提交到数据库中,否则浏览器中看的参数改变,实际数据库并没有改版
增加数据
.add()
# 同样需要导入models
from models import Student
# 增加
@stu.route('/creatstu/')
def crest_stu():
stu = Student()
stu.s_name = 'coco%d' % random.randrange(100)
stu.s_age = '%d' % random.randrange(30)
# 添加随机数,方便看出数据库的每次的数据都不同
db.session.add(stu)
try:
# flask写表示上传到数据库
db.session.commit()
except:
db.session.rollback()
return '学生启动'
查找
查询全部
方法一:
查找全部,这里可以用 .query
@stu.route('/stulist/')
def stu_all():
方法一
stus = Student.query.all()
render_template('stus.html', stus=stus)
方法二:
可以用原生的sql语言查找
sql = 'select * from student;'
stus = db.session.execute(sql)
return render_template('stus.html', stus=stus)
查询指定参数
方法一:
filter
@stu.route('/stulistt/')
def stu_all2():
方法一filter
stus = Student.query.filter(Student.s_name == 'coco1')
return render_template('stus.html', stus=stus)
方法二:
filter_by
stus = Student.query.filter_by(s_name='coco1')
方法三:
原生sql
sql = 'select * from student where s_id<5;'
tus = db.session.execute(sql)
更新数据
方法一:
update
@stu.route('/update/')
def update_stu():
Student.query.filter(Student.s_id == 2).update({'s_name': '大大'})
db.session.commit()
return redirect(url_for('stu.stu_all'))
方法二:
filter找到后别名然后修改
stu = Student.query.filter_by(s_id=2).first()
stu.s_name = '海飞丝'
注意这里的first不是为了取值第一个,而是Flask是列表传入,如果不是。first那么就获取不到列表值
删除
delete()
# 删除id为5的学生
@stu.route('/dele/')
def del_stu():
stu = Student.query.filter(Student.s_id == 5).first()
db.session.delete(stu)
db.session.commit()
return '删除成功'
拓展
前面讲的前端数据库macro可以运用到前端读取数据库的方法中
# show.html
{% macro stu_list(id,name,age) %}
id: {{ id }}
姓名:{{ name }}
年龄:{{ age }}
{% endmacro %}
{% for i in stus %}
<li>
{% from 'show.html' import stu_list %}
{{ stu_list(i.s_id,i.s_name,i.s_age) }}
</li>
{% endfor %}
定义数据库的时候init
def __init__(self, name, age):
self.s_name = name
self.s_age = age
这样在上面增加数据方法的时候就可以直接使用
Student(name(定义的名字),age(定义的年龄))
from models import Student
# 增加
@stu.route('/creatstu/')
def crest_stu():
#就可以直接写入Student中了
stu = Student('coco%d' % random.randrange(100),'%d' % random.randrange(30))
db.session.add(stu)
try:
db.session.commit()
except:
db.session.rollback()
return '学生启动'