Flask框架——数据库配置及迁移同步
在上篇文章中,我们学习了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项目与数据库产生联系,我们可以执行这三个步骤:
- 配置数据库路径;
- app应用与映射建立联系;
- 添加数据库迁移命令。
配置数据库路径
连接数据库路径的语法为:
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