学习flask的番外2之数据库操作实战 - 图1

项目环境

Windows10
Python=3.6.8
虚拟环境:Anaconda
IDE:pycharm
时间:2019.4.20

写在前面

  今天来实验一下Flask中关于数据库的操作,分为三个部分。第一个部分是连接数据库创建表和对表的操作,第二个部分是直接数据迁移,第三个部分是从已有的表生成模型。一个一个的写。

第一部分,数据库连接

创建项目
首先创建一个Flask的项目,项目结构如下:
学习flask的番外2之数据库操作实战 - 图2
这只是一个最为基础的项目,我们的功能都放在这里面实现吧。
配置数据库相关参数

  1. app.config["SQLALCHEMY_DATABASE_URI"] = \
  2. "mysql+pymysql://root:420420@127.0.0.1:3306/flask"

这个是配置SQLAlchemy的URI的,然后格式请去参考我的上一篇文章。然后呢创建一个SQLAlchemy的对象db和创建一个模型:

  1. db = SQLAlchemy(app)
  2. class User(db.Model):
  3. uid = db.Column(db.INTEGER, primary_key=True)
  4. uname = db.Column(db.String(20), unique=Flask, nullable=False)

然后我们可以通过Flask Shell来使用,首先是打开你的shell:

  1. #打开shell
  2. flask shell
  3. from app import db
  4. db.create_all()

然后你就可以在数据库中看到你的表了:
学习flask的番外2之数据库操作实战 - 图3
或者是写一个函数(建议写函数):

  1. @app.route("/a/")
  2. def create():
  3. db.create_all()
  4. return "<h1>创建数据库成功</h1>"

通过访问后你就可以查看一下会发现也成功了。
插入数据
还是写一个函数来实现数据的插入,在flask中我们使用session来完成相关操作,这个session是db的:

  1. @app.route('/insert')
  2. def add_user():
  3. user = User()
  4. name = "我将有{}个女朋友".format(random.randint(0, 50))
  5. user.uname = name
  6. db.session.add(user)
  7. db.session.commit()
  8. return "<h1>add sucessful </h1>"

然后你访问你的路由几次,你就可以在数据库中看到你插入的数据,就像是这样
学习flask的番外2之数据库操作实战 - 图4
在执行完add等操作后要使用commit提交才会及时生效。
查询数据
同样的我们来查询一下数据吧,老规矩还是写一个函数:

  1. @app.route('/find')
  2. def find_user():
  3. user = User.query.all()
  4. for u in user:
  5. print(u.uname)
  6. return "ok"

来看一下输出:

  1. 我将有18个女朋友
  2. 我将有28个女朋友
  3. 我将有50个女朋友

这是我们表里的数据对吧,同时这里的user是一个list

第二部分,数据迁移

为什么要进行数据迁移
  当我们在进行开发或者学习的时候,也许我们最开始创建的模型太过于简陋然后需要我们增加一些字段,那么怎么来创建表呢?使用SQLAlchemy只有表不存在的时候才会创建,所以只有暴力的删除之前的表然后再进行创建,关键是这样你会破会表里面的数据,实在是不太美。所以会用到数据迁移,我在这里用到的是Flask-Migrate这样一个插件。

安装Flask-Migrate

  1. pip install flask-migrate

然后这是我们修改过后的模型,添加了一个email的属性:

  1. class User(db.Model):
  2. uid = db.Column(db.INTEGER, primary_key=True)
  3. uname = db.Column(db.String(20), unique=False, nullable=False)
  4. uemail = db.Column(db.String(40), unique=False, nullable=False)

然后我们开始使用我们的migrate:

  1. from flask_migrate import Migrate
  2. migrate = Migrate(app, db)

然后在控制台输入,如果你不是使用的Anaconda来管理环境可以在你装有flask的环境里执行这个:

  1. flask db init

学习flask的番外2之数据库操作实战 - 图5
然后你就会发现你的项目下多了一个文件夹,然后这个文件夹里面就有了一些迁移文件,我们可以开始数据迁移了。
在控制台输入:

  1. flask db migrate

使用这个命令来生成迁移脚本:
学习flask的番外2之数据库操作实战 - 图6

然后进行迁移:
学习flask的番外2之数据库操作实战 - 图7
最后你可以在你的数据库中看到你的字段已经添加到你的表当中:
学习flask的番外2之数据库操作实战 - 图8
我在这里也只是简单的一个练习,你可以去Flask-Migrate的官网看更详细的使用。
请你移步Flask-Migrate的官网

第三部分,逆向生成model

出现情况
  有些时候,我们需要直接使用已经存在的数据库和表,我们在flask中使用的话需要生成对应的model然后才能来使用,自己一个个的建?太麻烦了,也不推荐,我们可以使用Flask-Sqlacodegen这个扩展插件
开始试试:

  1. pip install flask-sqlacodegen

我们在创建的时候先来创建一个表试试吧:
学习flask的番外2之数据库操作实战 - 图9
然后在命令行使用:

  1. flask-sqlacodegen "mysql+pymysql://root:420420@localhost:3306/flask" > model.py

你会发现你的项目下面多了一个model文件:

  1. # coding: utf-8
  2. from sqlalchemy import Column, Integer, String
  3. from sqlalchemy.ext.declarative import declarative_base
  4. Base = declarative_base()
  5. metadata = Base.metadata
  6. class Student(Base):
  7. __tablename__ = 'Student'
  8. studentid = Column(Integer, primary_key=True)
  9. studentname = Column(String(100))
  10. studentclass = Column(Integer)
  11. class User(Base):
  12. __tablename__ = 'user'
  13. uid = Column(Integer, primary_key=True)
  14. uname = Column(String(20), nullable=False)
  15. uemail = Column(String(40))

基本上就成功了,剩下的就是自己完善。

写在后面

  我们在这里基本上就完成了数据库的常用操作,本文只做笔记,如果想要学习得更好,请移步各个插件的官方文档。当然如果那里写得不对,谢谢你的指出。