基础
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 新建数据库
- 方式1
# 登入数据库
mysql -u root -p
mysql> create database knowledge charset='utf8';
- 方式2
# 登入数据库
mysql -u root -p
mysql> create database knowledge character set utf8 collate utf8_general_ci;
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
更新,即将数据表的跟新写入数据库,完成真正的数据迁移.
2.4 数据库表字段更新
- 修改表
- 运行迁移
python3.6 run.py db migrate
- 运行更新
python3.6 run.py db upgrade
3 数据库操作
3.1 新增数据
- 操作指令1
# 数据表映射类实例化
# Knowledge类
knowledge = Knowledge()
# 修改表字段信息:question和answer字段
knowledge.question = "你好"
knowledge.answer = "你好"
# 添加
db.session.add(knowledge)
# 提交
db.session.commit()
- 操作指令1
# 数据表映射类实例化
# Knowledge类
# 修改表字段信息:question和answer字段
knowledge = Knowledge(question="你好", answer="你好")
# 添加
db.session.add_all([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对象,包含指定范围内的结果,用于获取指定页面内的数据,方法有items获取查询页的数据,pages获取页数量,page当前页码 |
- 查询全部数据
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类
# 默认排序
from sqlalchemy import desc
question = Knowledge.query.order_by(Knowledge.question).all()
# 降序排列
question = Knowledge.query.order_by(desc(Knowledge.question)).all()
# 查询id序号最大的两个数据
question = Knowledge.query.order_by(desc('id')).limit(2).all()
- 查询一条
question = Knowledge.query.limit(1).all()
- 精确查询
question = Knowledge.query.get(1)
- 分页查询
page_datas = Knowledge.query.paginate(1, 2, False)
print("crowd datas: {}".format(page_datas.items))
print("total page: {}".format(page_datas.pages))
print("current page: {}".format(page_datas.page))
其中,paginage(param1, param2, param3)
序号 | 参数 | 说明 |
---|---|---|
1 | param1 | 查询分页的页序号,从1开始 |
2 | param2 | 每页返回的数据行数 |
3 | param3 | 是否返回错误信息,False不返回 |
4 总结
(1) flask操作数据库流程:新建数据库
↦
\mapsto
↦数据库配置
↦
\mapsto
↦设计表结构
↦
\mapsto
↦新建表
↦
\mapsto
↦迁移配置及运行;
(2) 数据库操作:增删改查;
拓展阅读:
Flask SQLAlchemy数据类型
Flask数据库迁移及建表
MySQL常用命令手册
[参考文献]
[1]https://www.cnblogs.com/RomanticLife/p/8372624.html
[2]https://www.jianshu.com/p/032723bb9b05