Python Flask 编程 | 连载 11 -

3,534 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

python的副本.png

一、ORM 模型设计

在MTV架构中,M表示Model层负责与数据库进行交互,ORM(Object Relational Mapping)对象关系映射可以将具体的模型与数据库中的表进行一一对应,模型对象的属性与数据库表的字段是一一对应的;通过模型的操作来实现对数据库表的操作

ORM的重要特性:

  • 基于面向对象的编程思想
  • 几乎不写SQL,提升开发效率
  • 支持多种类型数据库切换

SQLAlchemy

SQLAlchemy 是一个提供了 SQL 工具包及对象关系映射(ORM)工具的第三方库,Flask框架本身是没有ORM功能的,因此需要通过使用Flask-SQLAlchemy扩展来实现ORM,关于Flask-SQLAlchemy的介绍可以参考官方文档

Flask的ORM扩展需要单独进行安装,但是需要提前安装 mysqlclient 依赖

# 依赖
pip3 install mysqlclient
pip3 install Flask-SQLAlchemy

Flask-SQLAlchemy连接数据库的配置如下:

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://用户名:密码@数据库地址/要连接的数据库'

SQLALCHEMY_DATABASE_URI,数据库URI既统一资源定位符,是一个用于标识资源名称的字符串

如果要配置多个数据库,可以使用这种方式

SQLALCHEMY_BINDS = {
    'mysql': 'mysqldb://localhost/数据库',
    'sqlite': 'sqlite:////path/to/数据库'
}

ORM 模型创建

在 PyCharm 创建新的 Flask 项目 flask-sqlalchemy。

image.png

使用 ORM 模型需要先绑定到 Flask 对象,在 app.py 中创建 Flask 对象之后,将对象绑定到数据库。

from flask_sqlalchemy import SQLAlchemy

# 配置数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@localhost/flask'
# 绑定Flask对象
db = SQLAlchemy(app)

接着在该文件中设计数据库模型 User。

# 设计数据库模型
class User(db.Model):
    # 指定表名称
    # __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), nullable=False)
    password = db.Column(db.String(256), nullable=False)
    birth_date = db.Column(db.Date, nullable=True)
    age = db.Column(db.Integer, default=0)

终端中执行创建命令输入 python3 ,通过执行以下命令创建表或者删除表。

from app import db
db.create_all() # 创建所有的表
db.drop_all() # 删除所有的表

退出命令行,重新进入,先执行删除,再执行创建,不指定表名时默认表名由sys+模型名称首字母小写。

image.png

ORM 模型字段类型:

字段类型字段描述
Integer/Float整数类型/浮点数类型
String(size)字符串,通过max_lenght指定字符串长度
Text长文本
DateTime时间类型,对应datetime
Boolean布尔类型
PickleType存储为一个持久化的Python对象
LargeBinary存储一个任意大的二进制数据

二、外键关联

二、外键关联、反向引用

image.png

image.png

image.png

创建数据库表

image.png

建立反向引用 image.png 当查询User对象时,通过User对象打点 user.address方法即可获取到所有的地址,lazy=True是指懒加载,只有但获取时才会查询address,默认只查询user时不会查询address

同样也可以在User实体类中建立Address的反向引用,当查询Address对象时,可以通过打点address.user来获取对应的user用户,使用懒加载模式

address = db.relationship('UserAddress', backref=db.backref('user', lazy=True))

三、UPDATE、DELETE

image.png

>>> from app import User, db
>>> user = User(id=1, username='stark', password='123')
>>> db.session.add(user)
>>> db.session.commit()
>>> user2 = User(id=2, username='thor', password='123456', birth_date='1978-01-01', age=1500)
>>> db.session.add(user2)
>>> db.session.commit()
>>> user3 = User(username='clint', password='12345')
>>> db.session.add(user3)
>>> db.session.commit()

image.png

image.png

>>> user.id
1
>>> user.username
'stark'
>>> db.session.add(user)
>>> db.session.commit()
>>> user.username = 'tony stark'
>>> db.session.add(user)
>>> db.commit()

image.png

image.png

>>> user_del = User.query.filter_by(id=1).first()
>>> user_del.username
'tony stark'
>>> db.session.delete(user_del)
>>> db.session.commit()

image.png

四、条件查询

image.png

>>> from app import db, User
/Users/jingnan/Library/Python/3.8/lib/python/site-packages/flask_sqlalchemy/__init__.py:872: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True or False to suppress this warning.
  warnings.warn(FSADeprecationWarning(
>>> all_user = User.query.all()
>>> all_user
[<User 2>, <User 4>]
>>> thor = User.query.filter_by(username='thor').first()
>>> thor
<User 2>

image.png

image.png

image.png

image.png

代码练习

image.png

image.png

image.png

image.png

image.png

实现分页,代码练习

image.png

image.png

image.png

image.png

image.png

image.png

image.png

添加上一页下一页按钮

image.png

判断是否有上一页和下一页

image.png

image.png