flask 数据库详细操作

目录

 

一.ORM

二.Flask-SQLAlchemy

三、数据库连接设置

四、数据库基本操作

1、创建表:

2、删除表

3、插入一条数据

4、一次插入多条数据

5、filter_by精确查询

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

7、filter模糊查询

8、get():

9、逻辑非

10、not_ 相当于取反

11、逻辑与

12、逻辑或

13、查询数据后删除

14、更新数据

15、关联查询示例:

别说自己尽力了,那只是自欺欺人的假话。


一.ORM

**ORM** 全拼`Object-Relation Mapping`,中文意为 **对象-关系映射**。主要实现模型对象到关系数据库数据的映射

优点 :

- 只需要面向对象编程, 不需要面向数据库编写代码.

  - 对数据库的操作都转化成对类属性和方法的操作.

  - 不用编写各种数据库的`sql语句`.

- 实现了数据模型与数据库的解耦, 屏蔽了不同数据库操作上的差异.

  - 不再需要关注当前项目使用的是哪种数据库。

  - 通过简单的配置就可以轻松更换数据库, 而不需要修改代码.

缺点 :

- 相比较直接使用SQL语句操作数据库,有性能损失.

- 根据对象的操作转换成SQL语句,根据查询的结果转化成对象, 在映射过程中有性能损失.

二.Flask-SQLAlchemy

flask默认提供模型操作,但是并没有提供ORM,所以一般开发的时候我们会采用flask-SQLAlchemy模块来实现ORM操作。

SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。

SQLAlchemy: https://www.sqlalchemy.org/

安装 flask-sqlalchemy
    pip install flask-sqlalchemy

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

    pip install flask-mysqldb

三、数据库连接设置

- 在 Flask-SQLAlchemy 中,数据库使用URL指定,而且程序使用的数据库必须保存到Flask配置对象的 **SQLALCHEMY_DATABASE_URI** 键中
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:[email protected]:3306/test'

- 其他设置:

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

- 配置完成需要去 MySQL 中创建项目所使用的数据库

$ mysql -uroot -p123456
$ create database flaskdemo charset=utf8;

四、数据库基本操作

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

1、创建表:

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

2、删除表

db.drop_all()

3、插入一条数据

ro1 = Role(name='admin')

db.session.add(ro1)

db.session.commit()

4、一次插入多条数据

us1 = User(name='wang',email='[email protected]',password='123456',role_id=ro1.id)

us2 = User(name='zhang',email='[email protected]',password='201512',role_id=ro2.id)

us3 = User(name='chen',email='[email protected]',password='987654',role_id=ro2.id)

us4 = User(name='zhou',email='[email protected]',password='456789',role_id=ro1.id)

us5 = User(name='tang',email='[email protected]',password='158104',role_id=ro2.id)

us6 = User(name='wu',email='[email protected]',password='5623514',role_id=ro2.id)

us7 = User(name='qian',email='[email protected]',password='1543567',role_id=ro1.id)

us8 = User(name='liu',email='[email protected]',password='867322',role_id=ro1.id)

us9 = User(name='li',email='[email protected]',password='4526342',role_id=ro2.id)

us10 = User(name='sun',email='[email protected]',password='235523',role_id=ro2.id)

db.session.add_all([us1,us2,us3,us4,us5,us6,us7,us8,us9,us10])

db.session.commit()

5、filter_by精确查询

返回名字等于wang的所有人

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

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

User.query.first()

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

User.query.all()

7、filter模糊查询

返回名字结尾字符为g的所有数据。

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

8、get():

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

User.query.get()

9、逻辑非

返回名字不等于wang的所有数据

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

10、not_ 相当于取反

from sqlalchemy import not_
User.query.filter(not_(User.name=='chen')).all()

11、逻辑与

需要导入and,返回and()条件满足的所有数据

from sqlalchemy import and_
User.query.filter(and_(User.name!='wang',User.email.endswith('163.com'))).all()

12、逻辑或

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

13、查询数据后删除

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

14、更新数据

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

15、关联查询示例:

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

- 查询角色的所有用户

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

- 查询用户所属角色

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

 

别说自己尽力了,那只是自欺欺人的假话。

你可能感兴趣的:(新手)