flask新建数据库及数据库迁移详解

基础
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 新建数据库

  • 方式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 过滤器方法

序号过滤器描述
1filter()把过滤器添加到原查询上,返回一个新查询,支持比较运算
2filter_by()把等值的过滤器添加到原查询上,返回一个新查询,不支持比较运算
3limit()使用指定的值限定原返回结果的数量,返回一个新查询
4offset()偏移原查询返回的结果,返回一个新查询
5order_by()根据指定条件对原结果进行排序,返回一个新查询
6group_by()根据指定条件对原查询结果进行分组,返回一个新查询

3.4.2 返回数据方法

序号过滤器描述
1all()以列表形式返回结果,用于返回全部匹配的结果
2first()返回查询的第一个结果,如果没有结果,返回None
3first_or_404()返回查询第一个结果,如果没有结果,终止请求,返回404
4get()返回主键对应的行,如果没有对应的行,返回None
5get_or_404()返回指定主键对应的行,如果未找到主键,则终止请求,返回404
6count()返回查询结果的数量,用于统计数据量
7paginate()返回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)

序号参数说明
1param1查询分页的页序号,从1开始
2param2每页返回的数据行数
3param3是否返回错误信息,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


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值