草庐IT

Flask框架——数据库配置及迁移同步

白巧克力LIN 2023-03-28 原文

在上篇文章中,我们学习了Flask框架——蓝图、flask-script,这篇文章我们来学习Flask框架——数据库的配置及迁移同步。

要想Flask框架与数据库产生联系,我们使用了pymysql库、flask-sqlalchemy扩展、flask-migrate数据库迁移工具。

这些库和扩展安装方式如下所示:

pip install pymysql
pip install flask-sqlalchemy
pip install flask-migrate

其中:

  • pymysql: Python3.x版本中用于连接 MySQL服务器的一个库;
  • flask-sqlalchemy:实现ORM对象关系映射的扩展工具;
  • flask-migrate:数据库迁移工具。

要想使Flask项目与数据库产生联系,我们可以执行这三个步骤:

  1. 配置数据库路径;
  2. app应用与映射建立联系;
  3. 添加数据库迁移命令。

配置数据库路径

连接数据库路径的语法为:

SQLALCHEMY_DATABASE_URI='数据库+数据库的驱动库://用户名:密码@主机ip:端口号/数据库名'

我们一般都在settings配置文件中配置数据库的连接路径,代码如下所示:

class Config:
    ENV='development'       #开发环境配置
    DEBUG=True              #调试模式为True
    # 配置连接数据库路径
    SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@127.0.0.1:3306/test'

注意:SQLALCHEMY_DATABASE_URI一定不能写错。
配置好数据库连接路径之后,接下来我们在app.py文件中通过app.config.from_object()加载配置文件,代码如下所示:

from flask import Flask
from flask_script import Manager
import settings

app = Flask(__name__)
app.config.from_object(settings.Config)
manager=Manager(app)

if __name__ == '__main__':
    manager.run()

好了,这样数据库连接路径就配置好了,这里我们通过Manager()方法创建了flask脚本管理工具对象manager,命令都交给manager对象来管理。

app与映射建立联系

在项目根目录下创建ext包,这个包用来存放第三方扩展工具,创建好包之后,我们在包中的init.py文件中创建映射对象,代码如下所示:

from flask_sqlalchemy import SQLAlchemy
db=SQLAlchemy()

创建映射对象之后,就要将映射对象与app相关联,由于我们的init.py中没有app对象,所以需要在app.py中关联映射对象,代码如下所示:

from ext import db
db.init_app(app)

当init.py文件中有app对象,那么我们可以直接在SQLAlchemy()传入参数app。

这样就使映射与app应用建立了关系。

数据库迁移命令

app应用与映射建立关系后,为了能更好地使用数据库相关的命令,我们把数据库迁移命令交给manager对象来管理,在app.py中添加下面代码即可:

# 将数据库迁移命令交给manager来管理
migrate=Migrate(app=app,db=db)
manager.add_command('db',MigrateCommand)

其中:

  • Migrate()方法参数中db是你要关联的映射;
  • add_command()添加命令方法,第一个参数是该命令名字,第二个参数是具体的命令。

这里我们数据库迁移命令名为db,这样就成功把数据迁移命令添加到app中了,如下图所示:



可以发现在命令中,多了db这个命令,我们通过在命令行中执行app.py db --help来查看有哪些命令,如下图所示:


创建模型

通过上面的步骤,我们使数据库与Flask项目产生了联系,接下来我们将创建数据模型,创建数据库模型简单来说就是创建模型类,创建数据表,首先我们创建一个名为models.py文件,代码如下所示:

from datetime import datetime
from ext import db
class User(db.Model):
    # 创建表名
    __tablename__ = 'user'
    # 创建数据库表字段
    # db.Column(类型,约束)
    id=db.Column(db.Integer,primary_key=True,autoincrement=True)
    username=db.Column(db.String(15),nullable=False)
    password=db.Column(db.String(15),nullable=False)
    phone=db.Column(db.String(11),unique=True)
    rdatetime=db.Column(db.DateTime,default=datetime.now)

这里我们创建了一个名为User的类,其作用是创建数据库表的字段,这里我们创建了id、username、password、phone、rdatetime字段,表名为user。

这里列出了常用的数据类型:

类型名 说明
Integer 普通整数
Smalllnteger 取值范围小的整数
BigInteger 不限制精度的整数
Float 浮点数
Numeric 普通整数
String 变长字符串
Text 变长字符串
Unicode 变长Unicode字符串
UnicodeText 变长Unicode字符串
Boolean 布尔值
Date 时间
Time 日期和时间
LargeBinary 存储大的二进制类型
PickleType 存储pickle类型、与序列化有关

数据库字段的可选参数如下表:

选项名 说明
primary_key 如果为True,代表表的主键
unique 如果为True,代表这列不允许出现重复的值
index 如果为True,为这列创建索引,提高查询效率
nullable 如果为True,允许有空值,如果为False,不允许有空值
default 默认值,如果default=datetime.now时,该列为当前系统数据

创建好模型后,我们一定要在app.py文件中导入模型,代码如下所示:

# from 模型文件 import 模型类 
from models import User

注意:要根据自身的模型来导入。

导入模型后,在命令行终端来执行下面的命令:

app.py db init

执行结果如下:



这时我们会发现在flask项目中多了一个migrations文件夹,其文件目录如下所示:



其中:

versions:版本文件夹,只要我们每迁移同步一次就会产生一个版本文件,其版本文件作用是记录我们对数据库做了哪些操作。

在命令行终端执行迁移命令来产生版本文件、版本号:

app.py db migrate

执行结果如下:



我们发现在migrations文件夹中的versions文件夹中创建一个4bddd28872cd_.py文件,该文件为版本文件,该文件名为版本号。

产生版本文件中,我们执行同步命令就产生对应的内容:

app.py db upgrade

运行结果如下所示:



这样我们就成功成功同步了数据库,创建了一个名为user的数据库表,如下图所示:



这里我们是用Navicat Premium 15数据库可视化工具看的,大家也可以使用pycharm的Database查看。

双击Database中的alembic_version,如下图所示:



我们发现该数据库的alembic_version记录着版本号,当我们再执行迁移同步命令。

数据库alembic_version中就会记录最新的版本号。当我们需要对数据库进行降级处理就可以通过版本号来执行下面代码,即可降级:

app.py db downgrade

当我们需要再从user数据表中添加字段时,直接在models.py文件中添加字段,并通过执行迁移同步命令即可更新user数据表。

注意:在数据表中添加字段时,最新的版本号与alembic_version版本号必须要一致,否则会报错。

添加数据

创建模型后,我们接下来尝试将网页的数据存放在我们刚才创建的数据库中。

首先我们编写模板文件register.html,其代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<form action="{{ url_for('register') }}" method="post">
    <p><input type="text" name="username" placeholder="用户名"></p>
    <p><input type="password" name="password" placeholder="密码"></p>
    <p><input type="password" name="repassword" placeholder="确认密码"></p>
    <p><input type="text" name="phone" placeholder="手机号码"></p>
    <p><input type="submit" value="用户注册"></p>
</form>

</body>
</html>

编写模板文件后,接下来我们将编写视图函数,其代码如下所示:

@app.route('/register',methods=['GET','POST'])
def register():
    if request.method=='POST':
        username=request.form.get('username')       #获取数据
        password=request.form.get('password')
        repassword=request.form.get('repassword')
        phone=request.form.get('phone')
        if password==repassword:
            user=User()                     #创建User模型类对象
            user.username=username
            user.password=password
            user.phone=phone
            db.session.add(user)            #添加数据   
            db.session.commit()             #提交事务
            return '用户注册成功'
        else:
            return '密码错误'
    return render_template('register.html')

通过db.session.add()方法来加入数据,并通过db.session.commit()方法来提交数据。

代码已经写好了,接下来将运行测试是否能加入数据到数据库里面了,执行如下代码:

app.py runserver

执行后,进入http://127.0.0.1:5000/register网页,如下图所示:


点击用户注册后,网页返回注册成功,这时我们来查看数据库中有没有我们加入的数据,如下图所示:

好了,我们成功将数据保存在数据库里面了,最后展示我们Flask项目的文件目录,如下图所示:

Flask框架——数据库配置及迁移同步就讲到这里了,下篇文章我们学习Flask框架——数据库操作命令(增删改查),感谢观看!!!
公众号:白巧克力LIN

有关Flask框架——数据库配置及迁移同步的更多相关文章

  1. ruby-on-rails - Ruby on Rails 迁移,将表更改为 MyISAM - 2

    如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  5. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  8. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  9. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  10. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

随机推荐