flask操作数据库详解

版权声明:找不到大腿的时候,让自己变成大腿. 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 操作流程

Created with Raphaël 2.2.0 开始 数据库建立与配置 表结构设计与新建 迁移配置及初始化 运行迁移migrate 运行更新upgrade 结束

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操作数据库流程:新建数据库 \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


猜你喜欢

转载自blog.csdn.net/Xin_101/article/details/88084860
今日推荐