小白学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)

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

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏丑胖侠

Java SPI机制实战详解及源码分析

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

8320
来自专栏大数据学习笔记

Neo4J:MERGE命令

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

19730
来自专栏zhisheng

Redis从入门到精通,至少要看看这篇!

常用的 SQL 数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力。

16540
来自专栏码客

Mysql配置(Win)

7720
来自专栏数据派THU

史上最全 | 数据分析技能详细拆解,一张图覆盖全流程知识细节和资源推荐(附下载)

而基于这些数据的分析,可以挖掘到非常多有价值的信息,这些信息正在成为大多数企业业务增长、迭代更新的关键。

12830
来自专栏码客

Oracle修改编码

安装Oracle时默认的编码就是ZHS16GBK 如果安装时选了别的编码 怎样把编码改回来呢 下面就说一下怎样把数据库编码改回ZHS16GBK

11130
来自专栏云服务器活动

利用腾讯云服务器搭建 Typecho 博客

Typecho是一个基于PHP的简洁的开源博客程序。它使用多种数据库(MySQL,PostgreSQL,SQLite)储存数据,在GNU GPLv2许可证下发行...

16230
来自专栏码客

xmpp乱码解决方案

openfire是一个非常不错的IM服务器,而且是纯Java实现,具有多个平台的版本,他的数据存储可以采用多种数据库,如MySQL,Oracle等。

7320
来自专栏实战docker

立即可用的实战源码(springboot+redis+mybatis+restTemplate)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

15020
来自专栏云服务器活动

搭建 LNMP 网站服务环境教程

LNMP指的是一个基于CentOS/Debian编写的Nginx、PHP、MySQL一键安装包。可以在VPS、独立主机上轻松的安装LNMP生产环境。LNMP代表...

20740

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励