数据库 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
进入解压目录
- 新建配置文件
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 修改basedir
和datadir
为自己实际的路径 - 初始化数据库
binmysqld --initialize --console
执行完命令,需记住命令行输出的
root@localhost:
后面的随机密码 - 安装服务 binmysqld --install
- 启动服务 net start mysql
- 首次连接修改密码
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.<过滤方法>.<查询方法>
# 查询全部
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()
定义实体关系
定义两张表之间的关系
代码语言: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