前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask-SQLAlchemy操作数据库

Flask-SQLAlchemy操作数据库

作者头像
菲宇
发布2020-03-19 17:50:16
1.5K0
发布2020-03-19 17:50:16
举报
文章被收录于专栏:菲宇菲宇

flask默认提供模型操作,但是并没有提供ORM,所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。 SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。 SQLAlchemy: https://www.sqlalchemy.org/

安装 flask-sqlalchemy

代码语言:javascript
复制
pip install flask-sqlalchemy

如果连接的是 mysql 数据库,需要安装 mysqldb **驱动**

代码语言:javascript
复制
pip install flask-mysqldb

创建数据库 登录mariadb并创建demo数据库

代码语言:javascript
复制
$ mysql -uroot -p123456
$ create database demo charset=utf8;

连接数据库设置

在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 **SQLALCHEMY_DATABASE_URI** 键中

代码语言:javascript
复制
 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/demo'

其他设置:

代码语言:javascript
复制
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
#查询时会显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = True

常用的SQLAlchemy字段类型

类型名

python中类型

说明

Integer

int

普通整数,一般是32位

SmallInteger

int

取值范围小的整数,一般是16位

BigInteger

int或long

不限制精度的整数

Float

float

浮点数

Numeric

decimal.Decimal

普通整数,一般是32位

String

str

变长字符串

Text

str

变长字符串,对较长或不限长度的字符串做了优化

Unicode

unicode

变长Unicode字符串

UnicodeText

unicode

变长Unicode字符串,对较长或不限长度的字符串做了优化

Boolean

bool

布尔值

Date

datetime.date

时间

Time

datetime.datetime

日期和时间

LargeBinary

str

二进制文件

代码语言:javascript
复制
### 常用的SQLAlchemy列选项

选项名

说明

primary_key

如果为True,代表表的主键

unique

如果为True,代表这列不允许出现重复的值

index

如果为True,为这列创建索引,提高查询效率

nullable

如果为True,允许有空值,如果为False,不允许有空值

default

为这列定义默认值

代码语言:javascript
复制
### 常用的SQLAlchemy关系选项

选项名

说明

backref

在关系的另一模型中添加反向引用,用于设置外键名称,在1查多的

primary join

明确指定两个模型之间使用的联结条件

uselist

如果为False,不使用列表,而使用标量值

order_by

指定关系中记录的排序方式

secondary

指定多对多关系中关系表的名字

secondary join

在SQLAlchemy中无法自行决定时,指定多对多关系中的二级联结条件

数据库基本操作

  • - 在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
  • - 会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 commit() 方法提交会话。
  • - 在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。
  • - 最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

常用的SQLAlchemy查询过滤器

过滤器

说明

filter()

把过滤器添加到原查询上,返回一个新查询

filter_by()

把等值过滤器添加到原查询上,返回一个新查询

limit()

使用指定的值限定原查询返回的结果

offset()

偏移原查询返回的结果,返回一个新查询

order_by()

根据指定条件对原查询结果进行排序,返回一个新查询

group_by()

根据指定条件对原查询结果进行分组,返回一个新查询

常用的SQLAlchemy查询结果的方法

方法

说明

all()

以列表形式返回查询的所有结果

first()

返回查询的第一个结果,如果未查到,返回None

first_or_404()

返回查询的第一个结果,如果未查到,返回404

get()

返回指定主键对应的行,如不存在,返回None

get_or_404()

返回指定主键对应的行,如不存在,返回404

count()

返回查询结果的数量

paginate()

返回一个Paginate对象,它包含指定范围内的结果

创建表:

db.create_all() # 注意,create_all()方法执行的时候,需要放在模型的后面### 删除表 db.drop_all()

插入一条数据

ro1 = Role(name='admin') db.session.add(ro1) db.session.commit() 再次插入一条数据 ro2 = Role(name='user') db.session.add(ro2) db.session.commit()

一次插入多条数据

us1 = User(name='wang',email='wang@163.com',password='123456',role_id=ro1.id) us2 = User(name='zhang',email='zhang@189.com',password='201512',role_id=ro2.id) us3 = User(name='chen',email='chen@126.com',password='987654',role_id=ro2.id) us4 = User(name='zhou',email='zhou@163.com',password='456789',role_id=ro1.id) us5 = User(name='tang',email='tang@163.com',password='158104',role_id=ro2.id) us6 = User(name='wu',email='wu@gmail.com',password='5623514',role_id=ro2.id) us7 = User(name='qian',email='qian@gmail.com',password='1543567',role_id=ro1.id) us8 = User(name='liu',email='liu@163.com',password='867322',role_id=ro1.id) us9 = User(name='li',email='li@163.com',password='4526342',role_id=ro2.id) us10 = User(name='sun',email='sun@163.com',password='235523',role_id=ro2.id) db.session.add_all([us1,us2,us3,us4,us5,us6,us7,us8,us9,us10]) db.session.commit() filter_by精确查询

返回名字等于wang的所有人

User.query.filter_by(name='wang').all()

first()返回查询到的第一个对象

User.query.first()

all()返回查询到的所有对象

User.query.all()

filter模糊查询,返回名字结尾字符为g的所有数据。

User.query.filter(User.name.endswith('g')).all()

get():参数为主键,如果主键不存在没有返回内容

User.query.get()

逻辑非,返回名字不等于wang的所有数据

User.query.filter(User.name!='wang').all()

not_ 相当于取反 from sqlalchemy import not_ User.query.filter(not_(User.name=='chen')).all()

逻辑与,需要导入and,返回and()条件满足的所有数据from sqlalchemy import and_ User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()

逻辑或,需要导入or_ from sqlalchemy import or_ User.query.filter(or_(User.name!='wang',User.email.endswith('163.com'))).all()

查询数据后删除

user = User.query.first() db.session.delete(user) db.session.commit() User.query.all()

更新数据

user = User.query.first() user.name = 'dong' db.session.commit() User.query.first()

关联查询示例:

> 角色和用户的关系是一对多的关系,一个角色可以有多个用户,一个用户只能属于一个角色。

- 查询角色的所有用户

查询roles表id为1的角色 ro1 = Role.query.get(1) 查询该角色的所有用户 ro1.us.all()

- 查询用户所属角色

#查询users表id为3的用户 us1 = User.query.get(3) #查询用户属于什么角色 us1.role

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档