【Flask】什么是Flask-SQLAlchemy?

版权声明:欢迎交流,转载请注明出处。 https://blog.csdn.net/u013034226/article/details/83386147

目录

ORM:

SQLAlchemy:

Flask-SQLAlchemy:

安装及配置:

Flask-SQLAlchemy对数据库的操作:


在认识Flask-SQLAlchemy之前,先要了解ORM和SQLAlchemy。

ORM:

概念
ORM:对象关系映射,英语:(Object Relational Mapping,简称ORM,或O/RM,或O/R mapping)
产生背景:
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系型数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
具体表现:
表现为我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQL 语句打交道,只需简单的操作实体对象的属性和方法。ORM 技术是在对象和关系之间提供了一条桥梁,前台的对象型数据和数据库中的关系型的数据通过这个桥梁来相互转化 。
缺点 :
相比较直接使用SQL语句操作数据库,有性能损失.
根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.

SQLAlchemy:

SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。→文档

Flask-SQLAlchemy:

Flask-SQLAlchemy是一个简化了 SQLAlchemy 操作的flask扩展。

安装及配置:

安装 flask-sqlalchemy:pip install flask-sqlalchemy
 
数据库连接配置:
# 配置数据库的连接(演示使用mysql数据库)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@localhost/数据库名'

# 关闭动态追踪修改的警告信息 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

# 展示sql语句
# app.config['SQLALCHEMY_ECHO'] = True
其它配置:
SQLALCHEMY_POOL_SIZE                数据库连接池的大小。默认是引擎默认值(通常 是 5 )
SQLALCHEMY_POOL_TIMEOUT        设定连接池的连接超时时间。默认是 10 。
SQLALCHEMY_POOL_RECYCLE         多少秒后自动回收连接。这对MySQL是必要的,它默认移除闲置多于 8 小时的连接。注意如果使用了MySQL Flask-SQLALchemy 自动设定这个值为 2 小时。


常用的Flask_SQLAlchemy关系选项:
backref        在关系的另一模型中添加反向引用
primary join        明确指定两个模型之间使用的联结条件
secondary        指定多对多关系中关系表的名字
secondary join        在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件

Flask-SQLAlchemy对数据库的操作:


# 定义模型两个模型类,必须继承自db.Model
class Role(db.Model):
    # 手动指定mysql表的名称,
    __tablename__ = 'roles'
    id = db.Column(db.Integer,primary_key=True) # 主键
    name = db.Column(db.String(32),unique=True)
    # 定义关系引用,第一个参数User表示多方的类名
    # 第二个backref表示的是反向引用,给User模型用,实现多对一的查询
    # 等号左边给一方Role使用,backref给多方User使用
    # 通过`lazy='dynamic'`,获取出来的多的那一部分的数据,就是一个`AppenderQuery`对象了。
    # 这种对象既可以添加新数据,也可以跟`Query`一样,可以再进行一层过滤。
    # 总而言之一句话:如果你在获取数据的时候,想要对多的那一边的数据再进行一层过滤,那么这时候就         
    # 可以考虑使用`lazy='dynamic'`。
    us = db.relationship('User',backref='role',lazy='dynamic')


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(32))
    email = db.Column(db.String(32),unique=True)
    pswd = db.Column(db.String(32))
    # 定义外键,指向roles表的主键id
    role_id = db.Column(db.Integer,db.ForeignKey('roles.id')) 

增:
向数据库中添加数据要通过模型类来添加
添加一条数据:db.session.add(模型类类名)
添加多条数据(列表的形式):db.session.add_all([us1,us2,...])
在添加完之后,要有提交和回滚:
db.session.commit()
db.session.rollback()

删(先找到要删除的数据):
author = Author.query.get(id)
# 执行删除
db.session.delete(author)
db.session.commit()
db.session.rollback()

改:
方法一:
user = User.query.first()
user.name = 'dong'
db.session.commit()
方法二:
User.query.filter(User.name=='zhang').update({'name':"li"}) 
db.session.commit() 

数据库的查询:

# 定义方法,实现查询结果显示成可读字符串
def __repr__(self):
    return 'name:%s' % self.name

get查询:
User.query.get(1) 参数为主键,如果主键存在,没有返回值。

过滤查询:
User.query.filter(User.name=='wang').first() 都是过滤查询,接收的参数必须使用模型类的类名,都必须使用查询执行器。
User.query.filter_by(name='wang').all() 只能使用等值操作,参数为具体模型类的字段名,使用查询执行器。
User.query.filter().all() filter查询不加条件,相当于查询所有数据。
User.query.filter().limit(2).all() 限制查询数据的条目数

分页查询:
paginate = User.query.filter().paginate(1,2,False) 返回的是paginate对象,第一个参数为当前页数,第二个参数为每页的数据,第三个参数为false分页错误不报错
paginate.page 获取当前页数
paginate.pages 获取总页数
paginate.items 获取当前页数所有数据

排序查询:
User.query.order_by(User.id.desc()).all() 降序排序
User.query.order_by(User.id.asc()).all() 升序排序
※ limit:限制数据条目数,count:计数
关联查询示例:
代码中的关系引用定义:
us = db.relationship('User',backref='role')
一对多查询:使用relationship返回的对象。
>>> r = Role.query.get(1)
# 查询管理员有多少人
>>> r.us
[name:wang, name:zhou]

多对一查询:使用反向引用;
>>> User.query.get(2)
name:zhang
>>> u = User.query.get(2)
# 查询zhang的角色是什么
>>> u.role
name:user

猜你喜欢

转载自blog.csdn.net/u013034226/article/details/83386147