版权声明:找不到大腿的时候,让自己变成大腿. https://blog.csdn.net/Xin_101/article/details/88084860
基础
Flask SQLAlchemy数据类型
MySQL常用命令手册
0 环境
- Ubuntu18.04
- Python3.6
- mysql5.7.25
- flask
- flask-cors
- flask-sqlalchemy
- pymysql
- flask-script
- flask-migrate
1 文件结构
|-- sql_data_test
| |-- __pycache__
| | `-- config.cpython-36.pyc
| |-- app
| | |-- __init__.py
| | |-- __pycache__
| | | `-- __init__.cpython-36.pyc
| | `-- models
| | |-- __pycache__
| | `-- databases.py
| `-- run.py
2 操作流程
2.1 数据库建立与配置
2.1.0 新建数据库
# 登入数据库
mysql -u root -p
mysql> create database knowledge charset='utf8';
2.1.2 配置数据库
__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager, Server
from flask_migrate import Migrate, MigrateCommand
from flask_cors import CORS
app = Flask(__name__)
CORS(app, supports_credentials=True)
# 配置数据库连接:格式如下
# 数据库://用户名:密码@用户:数据库端口/数据库名称?数据库类型
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:123456@localhost:3306/knowledge?charset=utf8"
# 数据库变更追踪
app.config['SQLALCHEMY_TRACK_MODIFICATION'] = True
# 实例化SQLAlchemy
# 操作数据库的增删改查
db = SQLAlchemy(app)
# 迁移
migrate = Migrate(app, db)
manager = Manager(app)
# 添加db指令
manager.add_command('db', MigrateCommand)
# 添加runserver指令
manager.add_command('runserver', Server(host='0.0.0.0', port=8080, user_debugger=True))
2.2 新建表
2.2.1 设计表结构
databases.py
表结构
from app import db
from sqlalchemy import Column
class Knowledge(db.Model):
# 数据表名
__tablename__ = "knowledge"
# 数据表格式:utf8存储中文
__table_args__ = {'mysql_collate':'utf8_general_ci'}
id = db.Column(db.Integer, primary_key=True)
question = db.Column(db.String(320), unique=True)
answer = db.Column(db.String(320), unique=True)
def __repr__(self):
return "Knowledge:{}".format(self.question)
2.2.2 创建表
db.create_all()
run.py
from flask import Flask, jsonify, request
from flask_cors import CORS
from app import app, db, manager
from app.models.databases import Knowledge
CORS(app, supports_credentials=True)
if __name__ == "__main__":
db.create_all()
2.3 迁移配置与初始化
2.3.1 配置迁移
__init__.py
...
# 新建迁移对象
migrate = Migrate(app, db)
# 新建管理对象
manager = Manager(app)
# 添加迁移指令
manager.add_command('db', MigrateCommand)
# 添加运行指令
manager.add_command('runserver', Server(host="0.0.0.0", port=8088, use_debugger=True))
2.3.2 迁移初始化
run.py
from flask import Flask, jsonify, request
from flask_cors import CORS
from app import app, db, manager
from app.models.databases import Knowledge
import config
CORS(app, supports_credentials=True)
if __name__ == "__main__":
# 新建表
db.create_all()
# 迁移管理器
manager.run()
python run.py db init
生产迁移文件,目录结构:
| |-- migrations
| | |-- README
| | |-- alembic.ini
| | |-- env.py
| | |-- script.py.mako
| | `-- versions
迁移初始化生成新的迁移文件夹,包括版本控制,环境配置.
2.3.3 运行迁移及更新
- 运行迁移
python run.py db migrate
迁移根据数据库的变化,更新迁移,依据migrations
文件夹的versions
完成版本更新与控制,实现数据表的迁移维护.
- 运行更新
python run.py db upgrade
更新,即将数据表的跟新写入数据库,完成真正的数据迁移.
3 数据库操作
3.1 新增数据
- 操作指令
# 数据表映射类实例化
# Knowledge类
knowledge = Knowledge()
# 修改表字段信息:question和answer字段
knowledge.question = "你好"
knowledge.answer = "你好"
# 添加
db.session.add(knowledge)
# 提交
db.session.commit()
run.py
from flask import Flask, jsonify, request
from flask_cors import CORS
from app import app, db, manager
from app.models.databases import Knowledge
import config
# cross over
CORS(app, supports_credentials=True)
@app.route('/add_info', methods=["POST"])
def add_info():
# 外部输入
question = request.form['input']
answer = request.form['output']
# 实例化数据库类
knowledge = Knowledge()
# 更新表字段信息
knowledge.question = question
knowledge.answer = answer
# 添加信息
db.session.add(knowledge)
# 提交信息
db.session.commit()
return "add info success!"
if __name__ == "__main__":
db.create_all()
# manager.run()
app.run(host='0.0.0.0', port=8092, debug=True)
3.2 删除数据
- 删除数据表
db.drop_all()
- 删除单条数据
# 查询到要修改的数据
question = Knowledge.query.filter(Knowledge.question=="你好").first()
# 删除
db.session.delete(question)
# 提交
db.session.commit()
3.3 修改数据
# 查询到要修改的数据
question = Knowledge.query.filter(Knowledge.question=="你好").first()
# 修改
question.question = "大家好"
db.session.commit()
3.4 查询数据
3.4.1 过滤器方法
序号 | 过滤器 | 描述 |
---|---|---|
1 | filter() | 把过滤器添加到原查询上,返回一个新查询,支持比较运算 |
2 | filter_by() | 把等值的过滤器添加到原查询上,返回一个新查询,不支持比较运算 |
3 | limit() | 使用指定的值限定原返回结果的数量,返回一个新查询 |
4 | offset() | 偏移原查询返回的结果,返回一个新查询 |
5 | order_by() | 根据指定条件对原结果进行排序,返回一个新查询 |
6 | group_by() | 根据指定条件对原查询结果进行分组,返回一个新查询 |
3.4.2 返回数据方法
序号 | 过滤器 | 描述 |
---|---|---|
1 | all() | 以列表形式返回结果,用于返回全部匹配的结果 |
2 | first() | 返回查询的第一个结果,如果没有结果,返回None |
3 | first_or_404() | 返回查询第一个结果,如果没有结果,终止请求,返回404 |
4 | get() | 返回主键对应的行,如果没有对应的行,返回None |
5 | get_or_404() | 返回指定主键对应的行,如果未找到主键,则终止请求,返回404 |
6 | count() | 返回查询结果的数量,用于统计数据量 |
7 | paginate() | 返回Paginate对象,包含指定范围内的结果,用于获取指定页面内的数据 |
- 查询全部数据
question = Knowledge.query.all()
- 条件查询:满足条件
# 数据表映射类实例化
# Knowledge类
question = Knowledge.query.filter(Knowledge.question=="你好").first()
question = Knowledge.query.filter_by(question="你好").all()
- 条件查询:不满足条件
# 不等于"你好"的数据
from sqlalchemy import not_
question = Knowledge.query.filter(not_(Knowledge.question=="你好")).all()
question = Knowledge.query.filter(Knowledge.question!="你好").all()
- 条件查询:多条件
或
from sqlalchemy import or_
question = Knowledge.query.filter(or_(Knowledge.question=="你好", Knowledge.answer.endwith("了"))).all()
- 条件查询:多条件
且
from sqlalchemy import and_
question = Knowledge.query.filter(and_(Knowledge.question=="你好", Knowledge.answer.endwith("了"))).all()
- 排序查询
# 数据表映射类实例化
# Knowledge类
# 默认排序
question = Knowledge.query.order_by(Knowledge.question).all()
# 降序排列
question = Knowledge.query.order_by(desc(Knowledge.question)).all()
- 查询一条
question = Knowledge.query.limit(1).all()
- 精确查询
question = Knowledge.query.get(1)
4 总结
(1) flask操作数据库流程:新建数据库
数据库配置
设计表结构
新建表
迁移配置及运行;
(2) 数据库操作:增删改查;
拓展阅读:
Flask SQLAlchemy数据类型
Flask数据库迁移及建表
MySQL常用命令手册
[参考文献]
[1]https://www.cnblogs.com/RomanticLife/p/8372624.html
[2]https://www.jianshu.com/p/032723bb9b05