使用 Flask 3 搭建问答平台(二):User 模型搭建
创始人
2025-01-08 03:06:08
0次

前言

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

后面的章节均是如此

知识点

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>  

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

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

相关内容

热门资讯

实测交流透视挂!宝玛大厅ai智... 实测交流透视挂!宝玛大厅ai智能透视挂教程,宝玛大厅破解软件经验(本来有挂辅助)1、每一步都需要思考...
总算了解辅助器!朱雀吴江三缺一... 总算了解辅助器!朱雀吴江三缺一ai智能透视辅助挂技巧,朱雀吴江三缺一好像是有挂(有辅助挂细节)朱雀吴...
今日公布透视!九五至尊大厅ai... 今日公布透视!九五至尊大厅ai智能透视插件,九五至尊大厅有没有透视挂窍门(切实有挂技术)1、在九五至...
玩家必看科普开挂!聚闲麻将ai... 玩家必看科普开挂!聚闲麻将ai智能透视辅助挂软件,聚闲麻将总是真的有挂(有辅助挂方式)聚闲麻将能透视...
据报道开挂!旅游娱乐ai智能开... 据报道开挂!旅游娱乐ai智能开挂工具,旅游娱乐辅助工具演示(一直有挂教学)1、全新机制【旅游娱乐ai...
一分钟揭秘开挂!决胜朋来麻将a... 一分钟揭秘开挂!决胜朋来麻将ai智能透视辅助挂教程,决胜朋来麻将真是真的是有挂(有辅助挂总结)1、首...
如何分辨真伪透视!红牛ai智能... 如何分辨真伪透视!红牛ai智能透视攻略,红牛是不是有挂经验(真是有挂技术)1、操作简单,无需红牛手机...
2分钟细说辅助器!江湖大庆麻将... 2分钟细说辅助器!江湖大庆麻将ai智能透视辅助挂攻略,江湖大庆麻将竟然是真的有挂(有辅助挂头条)1、...
总算清楚透视挂!老夫子厅ai智... 总算清楚透视挂!老夫子厅ai智能透视挂技巧,老夫子厅怎么开挂课程(好像发现有挂)老夫子厅破解侠是真的...
解密关于辅助!菜鸟麻将ai智能... 解密关于辅助!菜鸟麻将ai智能透视辅助挂脚本,菜鸟麻将总是存在有挂(有辅助挂存在)1、用户打开应用后...