在上篇文章中,我们学习了Flask框架——蓝图、flask-script,这篇文章我们来学习Flask框架——数据库的配置及迁移同步。
要想Flask框架与数据库产生联系,我们使用了pymysql库、flask-sqlalchemy扩展、flask-migrate数据库迁移工具。
这些库和扩展安装方式如下所示:
pip install pymysql
pip install flask-sqlalchemy
pip install flask-migrate
其中:
要想使Flask项目与数据库产生联系,我们可以执行这三个步骤:
连接数据库路径的语法为:
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对象来管理。
在项目根目录下创建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)
其中:
这里我们数据库迁移命令名为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的数据库表,如下图所示:
双击Database中的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网页,如下图所示:
如何正确创建Rails迁移,以便将表更改为MySQL中的MyISAM?目前是InnoDB。运行原始执行语句会更改表,但它不会更新db/schema.rb,因此当在测试环境中重新创建表时,它会返回到InnoDB并且我的全文搜索失败。我如何着手更改/添加迁移,以便将现有表修改为MyISAM并更新schema.rb,以便我的数据库和相应的测试数据库得到相应更新? 最佳答案 我没有找到执行此操作的好方法。您可以像有人建议的那样更改您的schema.rb,然后运行:rakedb:schema:load,但是,这将覆盖您的数据。我的做法是(假设
我主要使用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
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用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_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m