专栏首页JAVAandPython君小白学Flask第十三天| 来谈谈数据库迁移、邮箱扩展的那些事!

小白学Flask第十三天| 来谈谈数据库迁移、邮箱扩展的那些事!

主要内容:

1. 数据库migrate扩展的使用简介

2. migrate的使用

3. 邮箱扩展

数据库migrate扩展的使用简介

在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。

更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。

在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。

为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上

首先要在虚拟环境中安装Flask-Migrate和Flask-Script。

pip install flask-migrate
pip install flask-script

migrate的使用

我们编写一个py文件来看看如何迁移数据库

database.py:

#coding=utf-8
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Manager

app = Flask(__name__)
manager = Manager(app)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
db = SQLAlchemy(app)

#第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
migrate = Migrate(app,db)

#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command('db',MigrateCommand)

#定义模型Role
class Role(db.Model):
    # 定义表名
    __tablename__ = 'roles'
    # 定义列对象
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64), unique=True)
    def __repr__(self):
        return 'Role:'.format(self.name)

#定义用户
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(64), unique=True, index=True)
    def __repr__(self):
        return 'User:'.format(self.username)
if __name__ == '__main__':
    manager.run()

创建迁移仓库:

#这个命令会创建migrations文件夹,所有迁移文件都放在里面。
python database.py db init

创建迁移脚本:

自动创建迁移脚本有两个函数,upgrade()函数把迁移中的改动应用到数据库中downgrade()函数则将改动删除。自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。对比不一定完全正确,有可能会遗漏一些细节,需要进行检查

#创建自动迁移脚本
python database.py db migrate -m 'initial migration'

更新数据库:

python database.py db upgrade

除了去更新数据库,有时我们可能需要回退到之前版本的数据库,那么如何回退数据库呢?

回退数据库时,需要指定回退版本号,由于版本号是随机字符串,为避免出错,建议先使用python database.py db history命令查看历史版本的具体版本号,然后复制具体版本号执行回退。

python database.py db downgrade 版本号

邮箱扩展Flask- Mail

除了上述的迁移数据库外,这里简单的给大家普及一个知识点:

在开发过程中,很多应用程序都需要通过邮件提醒用户,Flask的扩展包Flask-Mail通过包装了Python内置的smtplib包,可以用在Flask程序中发送邮件。

Flask-Mail连接到简单邮件协议(Simple Mail Transfer Protocol,SMTP)服务器,并把邮件交给服务器发送。

如下示例,通过开启QQ邮箱SMTP服务设置,发送邮件。

from flask import Flask
from flask_mail import Mail, Message

app = Flask(__name__)
#配置邮件:服务器/端口/传输层安全协议/邮箱名/密码
app.config.update(
    DEBUG = True,
    MAIL_SERVER='smtp.qq.com',
    MAIL_PROT=465,
    MAIL_USE_TLS = True,
    MAIL_USERNAME = '371673381@qq.com',
    MAIL_PASSWORD = 'goyubxohbtzfbidd',
)

mail = Mail(app)

@app.route('/')
def index():
 # sender 发送方,recipients 接收方列表
    msg = Message("This is a test ",sender='371673381@qq.com', recipients=['shengjun@itcast.cn','371673381@qq.com'])
    #邮件内容
    msg.body = "Flask test mail"
    #发送邮件
    mail.send(msg)
    print "Mail sent"
    return "Sent Succeed"

if __name__ == "__main__":
    app.run()

本文分享自微信公众号 - JAVAandPython君(JAVAandPythonJun),作者:JAP君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 小白学Django第四天| Django后台管理及配置MySQL数据库

    当我们在开发一个网站的时候,我们往往需要对数据表中的数据进行增删改查。例如在电商网中,每一个商家对商品的上架和下架以及商品信息的编辑都是需要对数据表进行操作的...

    Python进击者
  • 小白学Flask第十一天| flask-sqlalchemy数据库扩展包(一)

    学习过web开发的人也许都知道,在web开发中最常用的数据库就是关系模型数据库,关系型数据库把所有的数据都存储在表中,表用来给应用的实体建模,表的列数是固定的,...

    Python进击者
  • 小白学Flask第一天 | 我的第一个Flask程序

    相信大部分人进来读这篇文章是因为以前没接触过Flask框架,这里我给大家介绍一下这个框架。

    Python进击者
  • 【BUF大事件】:微信惊现支付漏洞,国外白帽先联系了360?Vivo NEX检测出百度手机输入法后台录音

    本周BUF大事件还是为大家带来了新鲜有趣的安全新闻,微信惊现支付漏洞,国外白帽子竟然先联系了360?百度手机输入法被Vivo NEX检测出后台录音;三星手机自动...

    FB客服
  • 看了这篇文章,那些复杂的计算机网络概念终于懂了!

    网络(network):是由若干结点(node)和连接这些结点的链路(link)组成; 互联网(internet):若干个网络用路由器连接起来就是互联网; (下...

    程序员的时光001
  • 【漫画】两台陌生的主机是如何保证数据正确交付的?

    小白:你知道吗?数据在传输的时候是分割成一小块一小块传输的,我们把这一小块的数据称之为一个分组。我们在传输这块分组的时候,主要面临两个问题。

    帅地
  • 《软件工程之美》打卡第二周

    这是笔者参加极客时间21天打卡第二周,分享和总结确实是个很好的学习方法,这一周我又对软件工程多了一些理解,每日总结内容如下:

    用户1130025
  • 计算机网络自学笔记:可靠数据传输的原理

    在这篇文章中,我们仅考虑在一般情况下可靠数据传输的问题,仅考虑单向数据传输的情况,即数据传输是从发送方到接收方的。可靠的、双向数据传输(即全双工数据传输)的情况...

    云时之间
  • 如何对不同行,同列名进行多维转一维?

    这里留个疑问,因为目前来看,列名都是一一对应的,如果列名不一致的话,如何进行处理呢?可以先行试着操作下。

    逍遥之
  • 第一章计算机网络和因特网-day01

    什么是因特网: 其一:构成因特网的基本硬件与软件。 其二:为分布式应用提供服务的联网基础设施。 终端机器称为主机( host ) 或者端系统( end syst...

    用户1134788

扫码关注云+社区

领取腾讯云代金券