Flask中如何使用MySQL数据库?

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.建立数据库对象

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)
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()

     

posted @ 2021-01-10 14:52  eliwang  阅读(1110)  评论(0编辑  收藏  举报