小白学Flask第十一天| flask-sqlalchemy数据库扩展包(一)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: 小白学Flask第十一天| flask-sqlalchemy数据库扩展包(一)
+关注继续查看

主要内容:

   1. 数据库的设置

   2. 定义模型

   3. 关系


数据库的设置


学习过web开发的人也许都知道,在web开发中最常用的数据库就是关系模型数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,行数是可变的。查询的语句也是结构化的语言。


关系型数据库的列定义了表中表示的实体的数据属性。比如:商品表里有name、price、number等。


Flask本身不限定数据库的选择,你可以选择SQL或NOSQL的任何一种。也可以选择更方便的SQLALchemy,类似于Django的ORM。SQLALchemy实际上是对数据库的抽象,让开发者不用直接和SQL语句打交道,而是通过Python对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升。


说类这么多,我们今天的主角就是SQLAlchemy。SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。


前面做了很多铺垫,那么直接进入到今天的主题。


首先关于数据库的安装,我相信在这里不必多说,这里使用的是mysql数据库,如何安装?请大家自行百度。


在前面我也提到了flask-sqlalchemy这个扩展。首先第一步就是去安装这个扩展:


pip install flask-sqlalchemy


简单粗暴,直接pip一下就ok了。


但是,除了这一个当然是不够的,因为我们需要链接到mysql数据库,所以还得安装下面的库:


pip install flask-mysqldb



使用Flask-SQLAlchemy扩展操作数据库,首先需要建立数据库连接。数据库连接通过URL指定,而且程序使用的数据库必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI键中,就例如下面这样:


app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test3'


说到这里,我们来对比一下在django是如何配置数据库:


image.png


可以看到两者是完全不相同的。


关于配置,这里给出详细一点的代码:



#设置连接数据库的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'

#设置每次请求结束后会自动提交数据库中的改动
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)


有关于SQLALCHEMY_TRACK_MODIFICATIONS键,flask-sqlachemy官方文档建议设置为Flase,以便于在不需要跟踪对象变化时降低内存消耗。


定义模型


模型是表示应用使用的持久化实体,在ORM中,模型一般是一个Python类,类中的属性就是数据库表中的列。


在这里我们来创建两个模型,分别是Role和User



class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)

    #repr()方法显示一个可读字符串
    def __repr__(self):
        return 'Role:%s'% self.name

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True, index=True)
    email = db.Column(db.String(64),unique=True)
    pswd = db.Column(db.String(64))

    def __repr__(self):
        return 'User:%s'%self.name


接触过数据库的朋友应该大体能看懂是什么意思。


__tablename__代表着数据库表的名称


下面的代码就是创建来一个整型的列id,以及一个字符串类的列name,并且id设置为主键


# 定义列对象    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(64), unique=True)

db.Column类构造函数的第一个参数是数据库列和模型属性的类型。这里为给大家准备了一份常用的SQLAlchemy列类型:


类型名python中类型说明
Integerint普通整数,一般是32位
SmallIntegerint取值范围小的整数,一般是16位
BigIntegerint或long不限制精度的整数
Floatfloat浮点数
Numericdecimal.Decimal普通整数,一般是32位
Stringstr变长字符串
Textstr变长字符串,对较长或不限长度的字符串做了优化
Unicodeunicode变长Unicode字符串
UnicodeTextunicode变长Unicode字符串,对较长或不限长度的字符串做了优化
Booleanbool布尔值
Datedatetime.date时间
Timedatetime.datetime日期和时间
LargeBinarystr二进制文件


同时也给出SQLAlchemy常用的列选项:


选项名说明
primary_key如果为True,代表表的主键
unique如果为True,代表这列不允许出现重复的值
index如果为True,为这列创建索引,提高查询效率
nullable如果为True,允许有空值,如果为False,不允许有空值
default为这列定义默认值


关系


关系型数据库当然得说说关系这个词,关系型数据库就是使用关系把不同表中的行联系在一起。


image.png


上图就是一个一对多的关系。


那么如何通过代码来实现这种关系呢?



class Role(db.Model):
   #...
   users = db.relationship('User', backref='role')
   
class User(db.Model):
   # ...
   role_id = db.Column(db.Integer, db.ForeignKey('role_id'))


添加到user模型中的role_id列被定义成外键,就是这个外键建立起列关系。传给db.ForeignKey()的参数‘role.id'表明,这列的值是roles表中的相应行的id值。


从“一”那一端可知,添加到Role模型中的users属性代表这个关系的面向对象吃的视角。对于一个Role实例,其users属性将返回和角色相关联的用户组成的列表(也就是“多“那一端)。


db.relationship()的第一个参数表明这个关系的另一端是哪个模型。backref参数向User模型中添加一个role属性,从而定义反向关系。通过User实例的这个属性可以获得对应的Role模型对象,而不用再通过role_id外键获取。


这里给出常用的SQLAlchemy关系选项:


选项名说明
backref在关系的另一模型中添加反向引用
primary join明确指定两个模型之间使用的联结条件
uselist如果为False,不使用列表,而使用标量值
order_by指定关系中记录的排序方式
secondary指定多对多中记录的排序方式
secondary join在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
Flask数据库之SQLAlchemy--介绍--链接数据库
Flask数据库之SQLAlchemy--介绍--链接数据库
|
5月前
|
Python
【Flask实战】sqlalchemy和Flask-SQLAlchemy使用对比
【Flask实战】sqlalchemy和Flask-SQLAlchemy使用对比
|
5月前
|
数据库 Python
【Flask】Flask-SQLAlchemy的增删改查(CRUD)操作
Flask-SQLAlchemy的增删改查(CRUD)操作
|
7月前
|
数据库 数据库管理 Python
一分钟快速实现Flask框架与SQLAlchemy框架的整合
一分钟快速实现Flask框架与SQLAlchemy框架的整合
|
11月前
|
数据库 Python
Flask学习与项目实战5:通过SQLAlchemy连接数据库进行ORM模型的简单增删改查
是对于数据库的ORM的框架,直接操作模型,安装命令为pip install SQLAlchemy。 SQLAlchemy是一个独立的ORMR框架,可以独立于FLASK存在,也可以在Django中使用。 Flask-SQLAlchemy是对SQLAlchemy的一个封装,更适合在flask使用。
Flask学习与项目实战5:通过SQLAlchemy连接数据库进行ORM模型的简单增删改查
|
存储 SQL 数据库
Flask Web 极简教程(三)- SqlAlchemy(Part A)
Flask Web 极简教程(三)- SqlAlchemy(Part A)
Flask Web 极简教程(三)- SqlAlchemy(Part A)
|
Python
Python编程:Flask扩展Flask-WTF和Flask-SQLAlchemy应用实例
Python编程:Flask扩展Flask-WTF和Flask-SQLAlchemy应用实例
Python编程:Flask扩展Flask-WTF和Flask-SQLAlchemy应用实例
|
数据库 Python
Python编程:Flask数据库扩展Flask-SQLAlchemy
Python编程:Flask数据库扩展Flask-SQLAlchemy
|
数据库 Python
Python Flask SQLAlchemy上下文介绍
如果您打算仅使用一个应用程序(app),则可以在很大程度上跳过本文。只要将您的应用程序传递给SQLAlchemy 构造函数,就可以设置好了。但是,如果要使用多个应用程序,或者要在要读取的功能中动态创建该应用程序。
186 0
|
数据库 Python
小白学Flask第十二天| flask-sqlalchemy数据库扩展包(二)
小白学Flask第十二天| flask-sqlalchemy数据库扩展包(二)
140 0
小白学Flask第十二天| flask-sqlalchemy数据库扩展包(二)
热门文章
最新文章
推荐文章
更多