Python Web 之 Flask-SQLAlchemy 框架

数据库 ORM 框架

什么是ORM?

Object-Relationl Mapping,它的作用是在关系型数据库和对象之间做一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 。简单说,ORM是一个可以使我们更简单的操作数据库的框架。

SQLAlchemy是什么?Flask-SQLAlchemy 又是什么?
SQLAlchemy是Python语言的一个关系型数据库框架,它提供了高层的 ORM 和底层的原生数据库的操作,让开发者不用直接和 SQL 语句打交道,而是通过 Python 对象来操作数据库,在舍弃一些性能开销的同时,大大提高了开发效率。

Flask-SQLAlchemy是一个简化了 SQLAlchemy 框架的Flask扩展,封装了对数据库的基本操作。该扩展既可结合Flask框架一起使用,也可以单独安装使用,非常灵活。

MySql-8安装

Windows 免安装版

下载并解压免安装版,使用管理员权限启动cmd命令行工具,cd进入解压目录

  1. 新建配置文件 my.ini

    [mysql]
    # 设置客户端默认字符集
    default-character-set=utf8mb4
    [mysqld]
    default_password_lifetime=0
    
    port=3306
    
    # 安装目录
    basedir=D:\MySql\mysql-8.0.16-winx64
    # 数据目录
    datadir=D:\MySql\Data
    
    # 最大连接数
    max_connections=200
    # 允许连接失败的次数
    max_connect_errors=10
    
    # 服务端默认使用的字符集
    character-set-server=utf8mb4
    # 默认的储存引擎
    default-storage-engine=INNODB
    
    # 插件认证方式
    default_authentication_plugin=mysql_native_password
    
    [client]
    # 客户端连接服务端时默认端口
    port=3306
    default-character-set=utf8mb4
    

    修改basedirdatadir为自己实际的路径

  2. 初始化数据库

    bin\mysqld --initialize --console
    

    执行完命令,需记住命令行输出的root@localhost:后面的随机密码

  3. 安装服务

    bin\mysqld --install
    
  4. 启动服务

    net start mysql
    
  5. 首次连接修改密码

    bin\mysql -u root -p
    

    输入直接记住的随机密码登录后,执行以下命令修改密码,将'password'中的值替换为自己的想要的密码

    ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    

图形化客户端

Navicat Premium
下载并安装 https://www.navicat.com.cn/download/navicat-premium

关于破解

建议个人学习用,公司里不要用破解

破解方法

Flask-SQLAlchemy

安装 flask-sqlalchemy

pip install flask-sqlalchemy

安装pymysql驱动

pip install pymysql

连接不同的数据库,有不同的URL格式,本文以MySQL为例

URL格式
在这里插入图片描述

实例:

import os
from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)

# 此处使用pymysql作为驱动
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:password@localhost:3306/my_db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)


class User(db.Model):
    # 第一个参数指定字段类型,后面设置属性,详见以下常用参数表
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)

class Message(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 关联外键(表名.字段名)


# 创建表
db.create_all()

# 插入数据
user = User(username='张三')
db.session.add(user)
# 提交
db.session.commit()

# user提交后才会生成id,用于Message的外键author_id
msg = Message(content='你好,世界',author_id=user.id)
db.session.add(msg)
db.session.commit()


if __name__ == "__main__":
    app.run()

SQLAlchemy常用参数

参数说明
primary_key如果设为 True,列为表的主键
unique如果设为 True,列不允许出现重复的值
index如果设为 True,为列创建索引,提升查询效率
nullable如果设为 True,列允许使用空值;如果设为 False,列不允许使用空值
default为字段设置默认值

SQLAlchemy常用字段类型

类型说明
Integer整数
Float浮点数
String变长字符串,可设置length
Text变长字符串,对较长或不限长度的字符串做了优化
Boolean布尔值
DatePython中的datetime.date 日期
TimePython中的 datetime.time 时间
DateTimePython中的 datetime.datetime 日期和时间
IntervalPython中的 datetime.timedelta 时间间隔
Enum枚举,一组字符串
PickleType任何 Python 对象 自动使用 Pickle 序列化
LargeBinary任意二进制数据

CRUD操作

Create 插入数据

1.实例化模型类
2.添加新创建的记录到数据库会话
3.提交数据库会话

    user = User(username='张三')
    db.session.add(user)
    db.session.commit()

Read 查询数据

<模型类>.query.<过滤方法>.<查询方法>

    # 查询全部
    User.query.all()
    # 过滤条件,并以列表形式,返回所有结果
    User.query.filter_by(username="张三").all()
    # 返回结果中的第一个
    User.query.filter_by(username="张三").first()

过滤方法

过滤器说明
filter()把过滤器添加到原查询上, 返回一个新查询
filter_by()把等值过滤器添加到原查询上, 返回一个新查询
limit()使用是zing的值限制原查询返回的结果数量, 返回一个新查询
offset()偏移原查询返回的结果, 返回一个新查询
order_by()根据指定条件对原查询结果进行排序, 返回一个新查询
group_by()根据指定条件对原查询结果进行分组, 返回一个新查询

查询方法

方法说明
all()以列表形式返回查询的所有结果
first()返回查询的第一个结果,如果没有结果,则返回 None
count()返回查询结果的数量
get()返回指定主键对应的行,如果没有对应的行,则返回 None

Update 修改数据

直接赋值给模型类的字段属性就可以改变字段值, 然后调用commit()方法提交会话即可

user = User.query.get(1)
user.username='李四'
db.session.add(user)
db.session.commit()

Delete 删除数据

删除和插入类似,把add()方法换成delete()方法, 最后调用commit()方法提交

user = User.query.get(1)
db.session.delete(user)
db.session.commit()

定义实体关系

定义两张表之间的关系

from datetime import datetime
from flask_sqlalchemy import SQLAlchemy


class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(80))
    body = db.Column(db.Text)
    pub_date = db.Column(db.DateTime)
    category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
    
    # 定义表之间的关系
    category = db.relationship('Category',backref=db.backref('posts', lazy='dynamic'))

class Category(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
选项名说明
backref在关系的另一个模型中添加反向引用
primaryjoin明确指定两个模型之间使用的联结条件。只在模棱两可的关系中需要指定.
lazy指定如何加载相关记录。
uselist如果设为 Fales,不使用列表,而使用标量值
order_by指定关系中记录的排序方式
secondary指定多对多关系中关系表的名字
secondaryjoinSQLAlchemy 无法自行决定时,指定多对多关系中的二级联结条件

欢迎关注我的公众号:编程之路从0到1

编程之路从0到1

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页