使用 Flask 3 搭建问答平台(二):User 模型搭建

前言

以下所有代码均是在之前的基础上添加!!!

后面的章节均是如此

知识点

  1. 使用 pymysql 模块连接数据库

  2. 在模型中创建用户数据表

  3. 初始化数据库、创建初始迁移脚本、应用初始迁移脚本

一、User 模型搭建

1.1 准备数据库

1.2 config.py

python 复制代码
# 数据库配置信息
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

python 复制代码
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

python 复制代码
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 三部曲

python 复制代码
# 初始化数据库迁移环境:
(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> 

执行完成后会多出来个文件夹

数据库同样也生成了两张表

相关推荐
想摆烂的不会研究的研究生19 小时前
每日八股——Redis(1)
数据库·经验分享·redis·后端·缓存
码熔burning19 小时前
MySQL 8.0 新特性爆笑盘点:从青铜到王者的骚操作都在这儿了!(万字详解,建议收藏)
数据库·mysql
xiaolizi56748919 小时前
安卓远程安卓(通过frp与adb远程)完全免费
android·远程工作
阿杰1000119 小时前
ADB(Android Debug Bridge)是 Android SDK 核心调试工具,通过电脑与 Android 设备(手机、平板、嵌入式设备等)建立通信,对设备进行控制、文件传输、命令等操作。
android·adb
猫头虎19 小时前
2025最新OpenEuler系统安装MySQL的详细教程
linux·服务器·数据库·sql·mysql·macos·openeuler
梨落秋霜19 小时前
Python入门篇【文件处理】
android·java·python
哈库纳玛塔塔19 小时前
放弃 MyBatis,拥抱新一代 Java 数据访问库
java·开发语言·数据库·mybatis·orm·dbvisitor
@LetsTGBot搜索引擎机器人21 小时前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
计算机毕设VX:Fegn089521 小时前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐1 天前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、