前言
以下所有代码均是在之前的基础上添加!!!
后面的章节均是如此
知识点
1. 使用 pymysql 模块连接数据库
2. 在模型中创建用户数据表
3. 初始化数据库、创建初始迁移脚本、应用初始迁移脚本
一、User 模型搭建
1.1 准备数据库
1.2 config.py
# 数据库配置信息
HOST = '127.0.0.1'
PORT = 3306
DATABASE = 'qa'
USER = 'root'
PASSWORD = 'YDD5201314'
DB_URI = 'mysql://{user}:{password}@{host}:{port}/{db}'.format(user=USER, password=PASSWORD, host=HOST, port=PORT, db=DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
-
HOST = '127.0.0.1'
:- 数据库服务器的主机地址,这里是本地主机,即localhost。
-
PORT = 3306
:- 数据库服务器的端口号,MySQL的默认端口是3306。
-
DATABASE = 'qa'
:- 要连接的数据库的名称,这里是
qa
。
- 要连接的数据库的名称,这里是
-
USER = 'root'
:- 连接数据库的用户名,这里是
root
。
- 连接数据库的用户名,这里是
-
PASSWORD = 'YDD5201314'
:- 连接数据库的用户密码,这里是
YDD5201314
。
- 连接数据库的用户密码,这里是
-
DB_URI
:- 使用格式化字符串构造一个数据库URI,该URI将用于配置SQLAlchemy的数据库连接。格式化字符串中的占位符被具体的数据库连接参数替换。
SQLALCHEMY_DATABASE_URI = DB_URI
:
- 将构造的数据库URI赋值给
SQLALCHEMY_DATABASE_URI
,这是Flask-SQLAlchemy用来配置数据库连接的标准配置项。
1.3 models.py
from datetime import datetime
from exts import db
class UserModel(db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
username = db.Column(db.String(20), unique=True, nullable=False)
password = db.Column(db.String(20), nullable=False)
email = db.Column(db.String(50), unique=True, nullable=False)
join_time = db.Column(db.DateTime(timezone=True), default=datetime.now)
-
__tablename__ = 'users'
:- 指定该模型对应的数据库表名为
users
。如果不指定,SQLAlchemy将默认使用类名的小写形式作为表名。
- 指定该模型对应的数据库表名为
-
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
:- 定义一个名为
id
的列。 - 数据类型为
Integer
。 - 该列是主键(
primary_key=True
)。 - 该列的值会自动递增(
autoincrement=True
)。
- 定义一个名为
-
username = db.Column(db.String(20), unique=True, nullable=False)
:- 定义一个名为
username
的列。 - 数据类型为
String
,最大长度为20个字符。 - 该列的值必须是唯一的(
unique=True
)。 - 该列不能为空(
nullable=False
)。
- 定义一个名为
-
password = db.Column(db.String(20), nullable=False)
:- 定义一个名为
password
的列。 - 数据类型为
String
,最大长度为20个字符。 - 该列不能为空(
nullable=False
)。
- 定义一个名为
-
email = db.Column(db.String(50), unique=True, nullable=False)
:- 定义一个名为
email
的列。 - 数据类型为
String
,最大长度为50个字符。 - 该列的值必须是唯一的(
unique=True
)。 - 该列不能为空(
nullable=False
)。
- 定义一个名为
-
join_time = db.Column(db.DateTime(timezone=True), default=datetime.now)
:- 定义一个名为
join_time
的列。 - 数据类型为
DateTime
,并启用时区支持(timezone=True
)。 - 该列的默认值是当前时间(
default=datetime.now
),即当插入新记录时,如果没有提供join_time
的值,则会使用当前时间作为默认值。
- 定义一个名为
1.4 app.py
from flask_migrate import Migrate
import pymysql
# 使 pymysql 模块模仿 MySQLdb 模块,从而让使用 MySQLdb 的代码可以无缝切换到 pymysql
# 必须放在第一行
pymysql.install_as_MySQLdb()
# 这行代码初始化了 Flask-Migrate 扩展,用于处理数据库迁移
migrate = Migrate(app, db)
pymysql.install_as_MySQLdb()
- 背景:SQLAlchemy和许多其他依赖MySQL的Python库通常默认使用
MySQLdb
作为MySQL数据库接口。 - 问题:
MySQLdb
可能不易安装或不兼容某些系统或环境(例如Windows)。 - 解决方案:
pymysql
是一个纯Python实现的MySQL客户端库,更易于安装和使用。 - 实现:通过调用
pymysql.install_as_MySQLdb()
,pymysql
模块就会以MySQLdb
的身份出现,所有对MySQLdb
的调用都会被重定向到pymysql
,从而让代码无需修改即可使用pymysql
。
migrate = Migrate(app, db)
- 背景:在开发和维护数据库驱动的应用程序时,数据库架构(如表、列等)经常需要进行修改。手动进行这些修改既繁琐又容易出错。
- 解决方案:数据库迁移工具(如Flask-Migrate)可以自动化和简化这一过程。
- Flask-Migrate:是Alembic(SQLAlchemy的数据库迁移工具)在Flask中的集成,用于管理数据库的迁移。
- 初始化:
Migrate(app, db)
初始化了 Flask-Migrate,绑定了 Flask 应用实例app
和 SQLAlchemy 实例db
。这允许你使用 Flask-Migrate 提供的命令行工具来创建、应用和管理数据库迁移。
1.5 三部曲
# 初始化数据库迁移环境:
(venv) PS D:\Flask-zhiliao\flaskProject> flask db init
Creating directory 'D:\\Flask-zhiliao\\flaskProject\\migrations' ... done
Creating directory 'D:\\Flask-zhiliao\\flaskProject\\migrations\\versions' ... done
Generating D:\Flask-zhiliao\flaskProject\migrations\alembic.ini ... done
Generating D:\Flask-zhiliao\flaskProject\migrations\env.py ... done
Generating D:\Flask-zhiliao\flaskProject\migrations\README ... done
Generating D:\Flask-zhiliao\flaskProject\migrations\script.py.mako ... done
Please edit configuration/connection/logging settings in 'D:\\Flask-zhiliao\\flaskProject\\migrations\\alembic.ini' before proceeding.
# 创建初始迁移脚本:
(venv) PS D:\Flask-zhiliao\flaskProject> flask db migrate
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected added table 'users'
Generating D:\Flask-zhiliao\flaskProject\migrations\versions\7ea6eff38af5_.py ... done
# 应用迁移脚本到数据库:
(venv) PS D:\Flask-zhiliao\flaskProject> flask db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 7ea6eff38af5, empty message
(venv) PS D:\Flask-zhiliao\flaskProject>
执行完成后会多出来个文件夹
数据库同样也生成了两张表