在线问答系统---数据库管理

数据库管理

1. 数据库模型

在一个系统中,数据库的设计是非常重要的,这里我们使用的数据库是mysql数据库。这里我就是不放数据库的详细设计和ER图了(没有写)

数据库模型分析


大概数据分析模型就是如图所示啦!

2. Flask定义和操作数据库

flask操作数据库,这里使用Flask-SQLAlchemy拓展.

2.1 Flask-SQLAlchemy

Flask-SQLAlchemy师一个为Flask应用增加的SQLAlChemy支持的拓展.详情可以查看Flask-SQLAlchemy文档

  1. 安装
pip install -U Flask-SQLAlchemy
  1. 配置
    数据库
    连接数据库
#SQLAlchemy 把一个引擎的源表示为一个连同设定引擎选项的可选字符串参数的 URI。URI 的形式
dialect+driver://username:password@host:port/databases
# 应用配置:mysql数据库
mysql://scott:tiger@localhost/mydatabase
  1. 应用
# 导入
from flask-sqlalchemy import SQLAlchemy
#
db=SQLAlchemy()

所以我们需要在入口文件中进行配置
需要在app.py里添加

from model import db
# 连接数据库
app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:123456@localhost/qa-online'
# 
app.config['SQLALCHEMY_TRACK_MODIFICATIONS ']=True
# 数据库初始化
db.init_app()
2.2 声明模型
  • 所有模型的基类叫做 db.Model。它存储在您必须创建的 SQLAlchemy 实例上
    这里关于数据库模型我就不多讲了,大家可以自己看文档Flask-SQLAlchemy文档

直接上代码(在线问答系统)
model.py

from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from utils import constants
from datetime import datetime

db = SQLAlchemy()
class User(db.Model):
    """用户模型"""
    __tablename__ ='accounts_user'
    id = db.Column(db.Integer,primary_key=True,autoincrement=True,comment="用户ID")
    username = db.Column(db.String(64),nullable=False,unique=True,comment="用户名")
    nickname = db.Column(db.String(64),comment="用户昵称")
    password = db.Column(db.String(256),nullable=False,comment="密码")
    avatar = db.Column(db.String(256),comment="用户的头像地址")
    # 用户是否可以登录系统
    status = db.Column(db.SmallInteger,
                       default=constants.UserStatus.USER_ACTIVE.value,
                       comment='用户状态')
    # 是否是超级管理员,管理员可以对所有的内容进行管理
    is_super = db.Column(db.SmallInteger, default=constants.UserRole.COMMON.value, comment="是否为超级用户")
    # 注册时间
    created_at = db.Column(db.DateTime, default=datetime.now,comment="注册时间")
    # 更新时间
    updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now,comment="更新时间")
    # profile = db.relationship('UserProfile')
class UserProfile(db.Model):
    """用户详细模型"""
    __tablename__="accounts_user_profile"
    id = db.Column(db.Integer,primary_key=True,comment="id")
    real_name = db.Column(db.String(128),comment="真实姓名")
    sex =db.Column(db.SmallInteger, default=constants.UserSex.UNknown.value, comment="用户性别")
    maxim = db.Column(db.String(256),comment="用户格言")
    address = db.Column(db.String(128),comment="用户地址")
    created_at = db.Column(db.DateTime, default=datetime.now, comment="新增时间")
    # 更新时间
    updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now, comment="修改时间")
    # 关联用户
    user_id = db.Column(db.Integer,db.ForeignKey('accounts_user.id'))
    # 建立一对一关系属性 user.profile profile.user
    user = db.relationship('User',backref=db.backref('profile',uselist =False))

class UserLoginHistory(db.Model):
    """用户详细模型"""
    __tablename__="accounts_login_history"
    id = db.Column(db.Integer,primary_key=True,comment="id")
    username = db.Column(db.String(64),nullable=False,unique=True,comment="用户名")
    login_type =db.Column(db.String(64),comment="登录平台")
    ip = db.Column(db.String(32),comment="ip地址")
    ua = db.Column(db.String(128),comment="登录来源")
    created_at = db.Column(db.DateTime, default=datetime.now, comment="登录时间")
    # 关联用户
    user_id = db.Column(db.Integer,db.ForeignKey('accounts_user.id'))
    # 建立一对一关系属性 user.profile profile.user
    user = db.relationship('User',backref=db.backref('user_login_history',uselist =False))

class Question(db.Model):
    """ 问题 """
    __tablename__ = 'qa_question'
    id = db.Column(db.Integer, primary_key=True)  # 主键
    # 问题标题
    title = db.Column(db.String(128), nullable=False)
    # 问题描述
    desc = db.Column(db.String(256))
    # 问题图片
    img = db.Column(db.String(256))
    # 问题详情
    content = db.Column(db.Text, nullable=False)
    # 浏览人数
    view_count = db.Column(db.Integer, default=0)
    # 逻辑删除
    is_valid = db.Column(db.Boolean, default=True)
    # 排序
    reorder = db.Column(db.Integer, default=0)
    # 创建时间
    created_at = db.Column(db.DateTime, default=datetime.now)
    # 最后修改的时间
    updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
    # 关联用户
    user_id = db.Column(db.Integer, db.ForeignKey('accounts_user.id'))
    # 建立与用户的一对多属性,user.question_list
    user = db.relationship('User', backref=db.backref('question_list', lazy='dynamic'))



class QuestionTags(db.Model):
    """问题标签"""
    __tablename__ ="qa_question_tag"
    id = db.Column(db.Integer,primary_key=True,comment="id")
    tag_name = db.Column(db.String(128),nullable=False,comment="标签名称")
    is_valid = db.Column(db.Boolean, default=True, comment="是否有效")
    created_at = db.Column(db.DateTime, default=datetime.now,comment="创建时间")
    q_id = db.Column(db.Integer, db.ForeignKey('qa_question.id'))
    question = db.relationship('Question', backref=db.backref('tag_list', uselist=False))

class QuestuionFollow(db.Model):
    """关注的问题"""
    __tablename__ ="qa_question_follow"
    id = db.Column(db.Integer,primary_key=True,comment="id")
    is_valid = db.Column(db.Boolean, default=True, comment="是否有效")
    created_at = db.Column(db.DateTime, default=datetime.now, comment="收藏时间")
    user_id = db.Column(db.Integer,db.ForeignKey('accounts_user.id'))
    q_id = db.Column(db.Integer, db.ForeignKey('qa_question.id'))
    user = db.relationship('User', backref=db.backref('question_follow_list', lazy='dynamic'))
    question = db.relationship('Question', backref=db.backref('question_follow_list', lazy='dynamic'))

class Answer(db.Model):
    """问题的回答"""
    __tablename__ = "qa_answer"
    id = db.Column(db.Integer, primary_key=True, comment="id")
    is_valid = db.Column(db.Boolean, default=True, comment="是否有效")
    created_at = db.Column(db.DateTime, default=datetime.now, comment="创建时间")
    updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)
    user_id = db.Column(db.Integer, db.ForeignKey('accounts_user.id'))
    q_id = db.Column(db.Integer, db.ForeignKey('qa_question.id'))
    user = db.relationship('User', backref=db.backref('answer_list', lazy='dynamic'))
    question = db.relationship('Question', backref=db.backref('answer_list', lazy='dynamic'))
class AnswerComment(db.Model):
    """回答的评论"""
    __tablename__='qa_answer_comment'
    id = db.Column(db.Integer, primary_key=True, comment="id")
    content = db.Column(db.String(512),nullable=False,comment="评论内容")
    love_count = db.Column(db.Integer,default=0,comment="赞同人数")
    is_public = db.Column(db.Boolean,default=True,comment="是否公开")
    is_valid = db.Column(db.Boolean, default=True, comment="是否有效")
    created_at = db.Column(db.DateTime, default=datetime.now, comment="创建时间")
    updated_at = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now)

    # 回复ID
    reply_id = db.Column(db.Integer, db.ForeignKey('qa_answer_comment.id'), nullable=True,comment="回复id")
    # 关联用户
    user_id = db.Column(db.Integer, db.ForeignKey('accounts_user.id'),comment="用户id")
    # 关联答案
    answer_id = db.Column(db.Integer, db.ForeignKey('qa_answer.id'),comment="回答id")
    # 关联问题
    q_id = db.Column(db.Integer, db.ForeignKey('qa_question.id'),comment="问题id")
    user = db.relationship('User', backref=db.backref('answer_comment_list', lazy='dynamic'))
    answer = db.relationship('Answer', backref=db.backref('answer_comment_list', lazy='dynamic'))
    question = db.relationship('Question', backref=db.backref('question_comment_list', lazy='dynamic'))

qa-online/utils/constants.py

""" 常量配置 """
from enum import Enum


class UserStatus(Enum):
    """ 用户状态 """
    # 启用,可以登录系统
    USER_ACTIVE = 1
    # 禁用,不能登录系统
    USER_IN_ACTIVE = 0


class UserRole(Enum):
    """ 用户的角色 """
    # 普通用户,可以使用前台功能
    COMMON = 0
    # 管理员用户,可以使用后台管理功能
    ADMIN = 1
    # 超级管理员用户,可以删除敏感数据,如用户等
    SUPER_ADMIN = 2

class UserSex(Enum):
    """用户的性别"""
    MAN = '男'
    WOMAN='女'
    UNknown = '不知'

这里我已经将我需要的数据模型的代码写好了,之后就是需要我们来创建数据库了.进入命令行界面

# 进入python环境
#1. 在命令行界面中输入:python
# 2. 导入db
from app import db
# 3. 创建数据库
db.create_all()

这里应该会进行报错了,具体怎么解决我到时在补上.
如果到这一步,我们在命令行界面中没有看到报错信息,则数据库创建成功.

数据库模型

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值