Python Web 之 Flask-SQLAlchemy 框架

2019-10-30 14:51:04 浏览数 (1)

数据库 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:MySqlmysql-8.0.16-winx64 # 数据目录 datadir=D:MySqlData # 最大连接数 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. 初始化数据库 binmysqld --initialize --console 执行完命令,需记住命令行输出的root@localhost:后面的随机密码
  3. 安装服务 binmysqld --install
  4. 启动服务 net start mysql
  5. 首次连接修改密码 binmysql -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

关于破解

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

破解方法[1]

Flask-SQLAlchemy

安装 flask-sqlalchemy

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

安装pymysql驱动

代码语言:javascript复制
pip install pymysql

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

URL格式

实例:

代码语言:javascript复制
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

布尔值

Date

Python中的datetime.date 日期

Time

Python中的 datetime.time 时间

DateTime

Python中的 datetime.datetime 日期和时间

Interval

Python中的 datetime.timedelta 时间间隔

Enum

枚举,一组字符串

PickleType

任何 Python 对象 自动使用 Pickle 序列化

LargeBinary

任意二进制数据

CRUD操作

Create 插入数据

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

代码语言:javascript复制
    user = User(username='张三')
    db.session.add(user)
    db.session.commit()
Read 查询数据

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

代码语言:javascript复制
    # 查询全部
    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()方法提交会话即可

代码语言:javascript复制
user = User.query.get(1)
user.username='李四'
db.session.add(user)
db.session.commit()
Delete 删除数据

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

代码语言:javascript复制
user = User.query.get(1)
db.session.delete(user)
db.session.commit()

定义实体关系

定义两张表之间的关系

代码语言:javascript复制
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

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

secondaryjoin

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

参考资料

[1]

破解方法: https://github.com/DoubleLabyrinth/navicat-keygen/blob/windows/README_FOR_WINDOWS.zh-CN.md

0 人点赞