### Flak 数据库与请求
#### 1.Flask 数据库
##### 1.1 ORM
+ ORM (Object Relational Mapping 对象映射关系) : 通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中.
+ 本质 : 将数据从一种形式转换到另一种形式
##### 1.2 Flask-SQLAlchemy 链接
1. 安装 Flask-SQLAlchemy : `pip install flask-sqlalchemy`
2. 使用
1. 链接 SQLite 数据库 (python自带)
1. 创建 dbSettings.py 文件 用于设置数据库
```python
import os
class Config:
# 获取项目所在绝对路径
# __file__ : 获取现在文件路径
BASE_DIR = os.path.abspath(os.path.dirname(__file__))
# 配置数据库的 URL
SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BASE_DIR, "my_db.sqlite")
# 配置-查看映射的 sql 语句
# app.config['SQLALCHEMY_CEHO'] = True
# 动态追踪修改设置
SQLALCHEMY_TRACK_MODIFICATIONS = True
```
2. 在 app.py 内引用 SQLite 设置
````python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from db_setting import Config
app = Flask(__name__)
# 添加 app 的数据库设置
app.config.from_object(Config)
# 创建核心对象
db = SQLAlchemy(app)
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
# 同步表结构
db.create_all()
if __name__ == '__main__':
app.run()
````
2. 链接 MySQL 数据库
1. 安装 PyMySQL : `pip install pymysql`
2. `pymysql.install_as_MySQLdb()` #2.x版本是内置的 MySQLdb 模块,3.x版本,MySQLdb 就不可以使用了
3. 数据库创建需要存储数据的库 : `CREATE DATABASE db_name charset=utf-8`
4. Flask-SQLAlchemy 链接数据库
+ 修改 SQLALCHEMY_DATABASE_URI 配置链接 MySQL 数据库
+ 链接内容 : `SQLALCHEMY_DATABASE_URI = 'mysql://username:password@server/db_name'`
| 参数 | 说明 |
| -------- | ---------- |
| mysql | 协议名 |
| username | 用户名 |
| password | 密码 |
| server | 主机IP |
| db | 数据库名称 |
+ `SQLALCHEMY_TRACK_MODIFICATIONS=True` : 默认为 True ,追踪对象的修改并且发送信号
5. 运行项目 : `db.create_all()`
1. 执行 `.create_all()` 方法将被创建的模型同步生成表结构
2. 注意 : `.create_all()`方法只能将新创建的模型同步表结构,如果模型修改或删除,`.create_all()`不会同步字段和属性
````python
from flask import Flask
from flask import render_template
from flask_sqlalchemy import SQLAlchemy
import pymysql
app = Flask(__name__)
pymysql.install_as_MySQLdb() # 2.x版本是内置的 MySQLdb 模块,3.x版本,MySQLdb 就不可以使用了
# 链接数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1:3306/test'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class Student(db.Model):
__tablename__ = 'Student'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(32))
# 创建表
db.create_all()
# 删除表
db.drop_all()
````
##### 1.3 数据库建模
+ SQLALCHEMY 建模常用字段
+ 常用字段类型
| 属性 | 描述 |
| -------- | ---------------------- |
| Integer | 整型 |
| Float | 浮点型 |
| Date | 时间类型(年月日) |
| DateTime | 时间类型(年月日时分秒) |
| Text | 长文本 |
| String | 变长字符串 |
+ 常用字段属性
| 属性 | 描述 |
| ----------- | ---------- |
| primary_key | 主键 |
| unique | 键值唯一性 |
| index | 索引 |
| nullable | 空值 |
| default | 默认值 |
+ 建模需要描述的内容
+ 业务主体 : 网站中对象
+ 主体关系 : 对象之间联系
+ 员工表模型
```python
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(32), unique=True)
password = db.Column(db.String(32))
nickname = db.Column(db.String(32), default="")
age = db.Column(db.Integer, default=18)
gender = db.Column(db.String(16), default="男")
score = db.Column(db.Float, nullable=True)
```
##### 1.4 目录结构化
1. app.py : 项目初始化,配置文件
```python
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from db_setting import Config
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
```
2. main.py : 项目控制文件
```python
from __init__ import app
if __name__ == '__main__':
app.run()
```
3. models.py : 模型文件 (存放数据库模型)
````python
from __init__ import db
class Student(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32))
# 同步表结构
db.create_all()
````
4. views.py : 视图文件 (存放引用视图)
```python
from __init__ import app
from flask import render_template
@app.route('/')
def hello_world():
return 'Hello World!'
```
##### 1.5 Flask-SQLAlchemy 操作
1. 单表操作
1. 增加数据
1. 增加单条数据
```python
person = Person(
username = "小孙",
password = "123456",
nickname = "老孙",
age = 12,
score = 45.5
)
```
2. 增加多条数据
```python
person1 = Person(
username = "小孙",
password = "123456",
nickname = "老孙",
age = 12,
score = 45.5
)
person2 = Person(
username = "小张",
password = "123456",
nickname = "老张",
age = 22,
score = 45.5
)
```
2. 查询
| 方法 | 说明 | 例子 |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| `.query.all()` | 查询符合条件的所有内容,返回值为列表,没有值就返回空列表 | 查询当前所有员工
`person_list = Person.query.all()` |
| `.query.get()` | 通过 id 进行查找,返回值为对象,没有值返回 None | 查 id 为 255 的员工
``person_list = Person.query.get(255)`` |
| `.query.filter()`