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

640?wx_fmt=png

主要内容:

     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:[email protected]: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

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

创建迁移脚本:

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

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

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

更新数据库:

python database.py db upgrade

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

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

python database.py db downgrade 版本号

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

邮箱扩展Flask- Mail

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

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

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

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

如下示例,通过开启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 = '[email protected]',	
    MAIL_PASSWORD = 'goyubxohbtzfbidd',	
)	

	
mail = Mail(app)	

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

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


扫描下方二维码,马上进入大神群!

640?wx_fmt=png

640?wx_fmt=png

你可能感兴趣的:(小白学Flask第十三天| 来谈谈数据库迁移、邮箱扩展的那些事!)