Flask数据库

wuchangjian2021-11-06 05:18:09编程学习

文章目录

  • 一、ORM
    • 1.1 什么是ORM
    • 1.2 ORM的优缺点有哪些?
    • 1.3 Flask-SQLAlchemy安装及设置
    • 1.4 其他配置信息
    • 1.5 常用的SQLAlchemy字段类型
    • 1.6常用的SQLAlchemy列选项
    • 常用的SQLAlchemy关系选项
  • 二、数据库基本操作
    • 2.1 数据库增删改
    • 2.2 添加数据
    • SQLAlchemy查询过滤器
    • SQLAlchemy查询执行器

一、ORM

1.1 什么是ORM

ORM 全拼Object-Relation Mapping. 称为对象-关系映射主要实现模型对象到关系数据库数据的映射.比如:把数据库表中每条记录映射为一个模型对象
在这里插入图片描述

1.2 ORM的优缺点有哪些?

优点 :

  • 对数据库的操作都转化成对类,属性和方法的操作.
  • 不用编写各种数据库的sql语句.
  • 不在关注,使用的是mysql、oracle…等数据库

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

1.3 Flask-SQLAlchemy安装及设置

  • SQLALchemy 实际上是对数据库的抽象,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,换来的是开发效率的较大提升
  • SQLAlchemy是一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作。flask-sqlalchemy 是一个简化了 SQLAlchemy 操作的flask扩展。
    文档地址:

安装

pip install flask-sqlalchemy

如果连接的是 mysql 数据库,需要安装 flask-mysqldb或者pymysql
pymysql 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使mysqldb。

pip install flask-mysqldb

如果flask-mysqldb安装不上,安装, pip install pymysql

数据库连接设置
设置数据库的链接地址,追踪信息
格式:mysql://<用户名>:<密码>@:<端口>/数据库名
如果安装pymysql ,需要这样连接数据库

mysql+pymysql://<用户名>:<密码>@:<端口>/数据库名

# 数据库链接地址
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/test'
# 动态追踪修改设置,如未设置只会提示警告
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

若要查看映射的sql语句,设置:app.config['SQLALCHEMY_ECHO'] = True
配置完成需要去 MySQL 中创建项目所使用的数据库

 mysql -uroot -pmysql
 create database test charset utf8;
"""
操作流程:

- 1.安装扩展
  - pip install flask_sqlalchemy
  - pip install flask_mysqldb / pymysql
- 2.设置数据库的配置信息
- 3.创建sqlalchemy对象db,关联app
- 4.编写模型类,字段,继承自db.Model,
- 5.操作数据库
  - 增删改
  - 查询
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 2.设置数据库的配置信息
# 设置数据库的链接信息,
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql://tom:123456@10.0.0.130:3306/test"
# 该字段增加了大量的开销,会被禁用,建议设置为False
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# 3.创建sqlalchemy对象db,关联app
db = SQLAlchemy(app)


# 4.编写模型类,字段,继承自db.Model
class Student(db.Model):
    __tablename__ = "students"
    # 主键, 参数1: 表示id的类型, 参数2: 表示id的约束类型
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))


@app.route('/')
def hello_world():
    return "helloworld"


if __name__ == '__main__':
    # 删除继承自db.Model的表
    db.drop_all()

    # 5.创建数据库的表,创建的是继承自db.Model的表
    db.create_all()

    app.run(debug=True)

mysql> show tables
    -> ;
+----------------+
| Tables_in_test |
+----------------+
| students       |
+----------------+
1 row in set (0.00 sec)

mysql> desc students;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

1.4 其他配置信息

在这里插入图片描述
连接不同类型数据库参考
bind操作多数据库

1.5 常用的SQLAlchemy字段类型

在这里插入图片描述

1.6常用的SQLAlchemy列选项

在这里插入图片描述

常用的SQLAlchemy关系选项

在这里插入图片描述

二、数据库基本操作

在Flask-SQLAlchemy中,插入、修改、删除操作,均由数据库会话管理。
会话用 db.session 表示。在准备把数据写入数据库前,要先将数据添加到会话中然后调用 db.session.commit() 方法提交会话。

在 Flask-SQLAlchemy 中,查询操作是通过 query 对象操作数据。
最基本的查询是返回表中所有数据,可以通过过滤器进行更精确的数据库查询。

2.1 数据库增删改

"""
增删改

- 全部都是使用db.session操作
- 常见方法:
  - db.session.add(obj) 添加单个对象
  - db.session.add_all([obj1,obj2]) 添加多个对象
  - db.session.delete(obj) 删除单个对象
  - db.session.commit() 提交会话
  - db.drop_all() 删除继承自db.Model所有表
  - db.create_all() 创建继承自db.Model的所有表
  - 其他:
    - db.session.rollback() 回滚
    - db.session.remove() 移除会话
  - 案例: 编写两个模型类, 一个角色模型类,  还有一个用户模型类
    - 关系: 一对多
"""


from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 1.设置数据库的配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://tom:123456@10.0.0.130:3306/test"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

# 2.创建SQLalchemy对象,关联app
db = SQLAlchemy(app)


# 3.编写模型类
# 角色(一方)
class Role(db.Model):
    __tablename__ = "roles"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    # 如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__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(32))

    # 建立外键
    role_id = db.Column(db.Integer, db.ForeignKey(Role.id))

    # 如果一个类继承自object那么重写__str__方法即可修改对象的默认输出, 如果是继承自db.Model那么需要重写__repr__方法
    def __repr__(self):
        return "<User:%s>" % self.name


@app.route('/')
def hello_world():
    return "helloworld"


if __name__ == '__main__':
    # 先删除表,后创建
    db.drop_all()
    db.create_all()

    app.run(debug=True)
mysql> desc roles;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | YES  |     | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

mysql> desc users;
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(11)     | NO   | PRI | NULL    | auto_increment |
| name    | varchar(32) | YES  |     | NULL    |                |
| role_id | int(11)     | YES  | MUL | NULL    |                |
+---------+-------------+------+-----+---------+----------------+

2.2 添加数据

realtionship描述了Role和User的关系。
第一个参数为对应参照的类"User"
第二个参数backref为类User,反向引用属性
第三个参数lazy决定了什么时候SQLALchemy从数据库中加载数据
如果设置为子查询方式(subquery),则会在加载完Role对象后,就立即加载与其关联的对象,这样会让总查询数量减少,但如果返回的条目数量很多,就会比较慢
设置为 subquery 的话,role.users 返回所有数据列表
另外,也可以设置为动态方式(dynamic),这样关联对象会在被使用的时候再进行加载,并且在返回前进行过滤,如果返回的对象数很多,或者未来会变得很多,那最好采用这种方式

"""
查询

"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 1.设置数据库的配置信息
app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://tom:123456@10.0.0.130:3306/test"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SQLALCHEMY_ECHO"] = True

# 2.创建SQLalchemy对象,关联app
db = SQLAlchemy(app)


# 3.编写模型类
# 角色(一方)
class Role(db.Model):
    __tablename__ = "roles"
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(32))

    # 给role添加了一个users属性, 那么查询的方式是, role.users
    # 给user添加了一个role属性, 那么查询的方式是, user.role
    users = db.relationship("User", backref="role", lazy="dynamic")

    # 如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__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(32))
    email = db.Column(db.String(32))
    password = db.Column(db.String(32))

    # 建立外键
    role_id = db.Column(db.Integer, db.ForeignKey(Role.id))

    # 如果一个类继承自object那么重写__str__方法即可, 如果是继承自db.Model那么需要重写__repr__方法
    def __repr__(self):
        return "<User:%s,%s,%s,%s>" % (self.id, self.name, self.email, self.password)


@app.route('/')
def hello_world():
    return "helloworld"


if __name__ == '__main__':
    # 为了演示方便,先删除表,后创建
    db.drop_all()
    db.create_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@itheima.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@itheima.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()

    app.run(debug=True)

SQLAlchemy查询过滤器

用来过滤数据,返回查询的结果集
在这里插入图片描述

SQLAlchemy查询执行器

用来执行结果集,得到具体数据
在这里插入图片描述

相关文章

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。