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()
相关文章
相关标签/搜索