1.安装相关模块
pip3 install flask-sqlalchemy
pip3 intall pymysql
2.导入模块
import pymysql
from flask_sqlalchemy import SQLAlchemy
3.指定数据库连接
# 语法:app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://username:passwd@hostname[:port]/dbname?charset=utf8'
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:mysql@127.0.0.1:3306/myflask?charset=utf8'
4.指定数据库配置,用来自动提交数据库变动
app.config['SQLALCHEMY_COMMIT_TEARDOWN'] = Ture
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
5.建立数据库对象
6.创建模型类,用来映射数据库表
class 类名(db.Model):
#声明表名,如果不指定,则默认表名为小写类名
__tablename__ = '表名'
#建立字段函数
字段名 = db.Column(字段类型,[参数]...)
...
例:
class Students(db.Model):
'''学生表'''
__tablename__ = 'stu' #默认表名为小写的类名即students,但可以通过__tablename__属性来设定
id = db.Column(db.Integer,primary_key=True,nullable=False) #主键默认自增,所以不需要再设置auto_increment参数
name = db.Column(db.String(20),nullable=False)
age = db.Column(db.Integer)
isDelete = db.Column(db.Boolean,nullable=False,default=False)
class Subjects(db.Model):
'''学科表'''
id = db.Column(db.Integer,primary_key=True,nullable=False)
title = db.Column(db.String(20),unique=True,nullable=False)
class Scores(db.Model):
'''成绩表'''
id = db.Column(db.Integer,primary_key=True,nullable=False)
stu_id = db.Column(db.ForeignKey(Students.id),nullable=False) # 外键
sub_id = db.Column(db.ForeignKey(Subjects.id),nullable=False)
score = db.Column(db.Integer,nullable=False)
6.1模型类中常见字段类型:
字段类型 |
说明 |
Integer |
常规整型,通常为32位 |
SmallInteger |
短整型,通常为16位 |
BigInteger |
精度不受限整型 |
Float |
浮点型 |
Numeric |
小数 |
String |
可变长度字符串 |
Text |
可变长度字符串,适合大量文本 |
Unicode |
可变长度Unicode字符串 |
Boolean |
布尔类型 |
Date |
日期类型 |
Time |
时间类型 |
DateTime |
日期时间类型 |
Interval |
时间间隔,相当于datetime.timedelta |
Enum |
字符列表 |
PickleType |
自动Pickle序列化 |
LargeBinary |
二进制 |
6.2 模型类中字段常见参数:
参数 |
说明 |
autoincrement |
是否自增(True/False) |
primary_key |
是否主键 |
index |
是否建立索引 |
unique |
是否唯一 |
nullable |
是否允许为null |
default |
设置默认值 |
db.ForeignKey(模型类名.id) |
创建外键约束 |
7.数据库增、删、改、查操作
-
添加:
laowang = Students(name='老王',age=30)
laozhang = Students(name='老张',age=35)
db.session.add(laowang)
db.session.add(laozhang)
# db.session.add_all([laowang,laozhang]) 一次性添加包含所有记录对象的列表
db.session.commit()
-
查找
- 完整的查询应该是:
<模型类>.query.<过滤方法>.<查询方法>
- 查询过滤器(返回新产生的查询对象)------可叠加使用
filter():使用指定的规则过滤记录
filter_by():使用指定的规则过滤记录(关键字表达式的形式)
order_by():根据指定条件对记录进行排序
limit():限制查询的条数
group_by():根据指定条件对记录进行分组
off_set():使用指定的值偏移原查询的结果
- 查询方法
all(): 返回所有包含查询记录的列表
first(): 返回查询的第一条记录,未查到则返回None
one(): 返回第一条记录,有且仅有一条记录,否则报错
get(id): 返回指定主键值的记录,未查到则返回None
count(): 返回查询结果的数量
one_or_none(): 有且仅有一条记录,返回记录,否则返回None
first_or_404(): 返回查询的第一条记录,未查到则报404错误
get_or_404(id): 返回指定主键值的记录,未查到则报404错误
paginate(): 返回一个Pagination对象,可以对记录进行分页处理
with_parent(类实例): 返回和这个实例相关联的对象
- 示例
from sqlalchemy import and_,or_,not_
Students.query.all() #查询所有 包含所有记录的列表
Students.query.filter_by(name='老张').first()#条件查询,精确查询
Students.query.filter(Students.name.endwith('王')).all()# 模糊查询,返回名字以'王'结尾的所有数据。
Students.query.filter(Students.name!='老王').all()#逻辑非
Students.query.filter(not_(Students.name=='老王')).all()#取反
Students.query.filter(and_(Students.name=='老王',Students.age=20)).all() #逻辑与
Students.query.filter(or_(Students.name=='老王',Students.age==30)).all() #逻辑或
Students.query.order_by(Students.age).all()#排序查询
Students.query.limit(1).all()#查询1条
Students.query.get(id = 1)#精确查询
-
更新
stu = Students.query.first()
stu.name = '老李'
db.session.commit()
-
删除
laowang = Students.query.filter_by(name='老王').first()
db.session.delete(laowang)
db.session.commit()