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:mysql@127.0.0.1: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()