1.安装相关模块
pip3 install flask-sqlalchemypip3 intall pymysql
2.导入模块
import pymysqlfrom 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:[email protected]:3306/myflask?charset=utf8\'
4.指定数据库配置,用来自动提交数据库变动
app.config[\'SQLALCHEMY_COMMIT_TEARDOWN\'] = Tureapp.config[\'SQLALCHEMY_TRACK_MODIFICATIONS\'] = Trueapp.config[\'SQLALCHEMY_COMMIT_ON_TEARDOWN\'] = True
5.建立数据库对象
db = SQLAlchemy(app)
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) | 
| prima56cry_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(): 返回查询的第一条记录,未查到则返回Noneone(): 返回第一条记录,有且仅有一条记录,否则报错get(id): 返回指定主键值的记录,未查到则返回Nonecount(): 返回查询结果的数量one_or_none(): 有且仅有一条记录,返回记录,否则返回Nonefirst_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()