在线问答系统---数据库管理
数据库管理
1. 数据库模型
在一个系统中,数据库的设计是非常重要的,这里我们使用的数据库是mysql
数据库。这里我就是不放数据库的详细设计和ER图了(没有写)
数据库模型分析
大概数据分析模型就是如图所示啦!
2. Flask定义和操作数据库
flask操作数据库,这里使用
Flask-SQLAlchemy
拓展.
2.1 Flask-SQLAlchemy
Flask-SQLAlchemy
师一个为Flask应用增加的SQLAlChemy支持的拓展.详情可以查看Flask-SQLAlchemy文档
- 安装
pip install -U Flask-SQLAlchemy
- 配置
连接数据库
#SQLAlchemy 把一个引擎的源表示为一个连同设定引擎选项的可选字符串参数的 URI。URI 的形式
dialect+driver://username:password@host:port/databases
# 应用配置:mysql数据库
mysql://scott:tiger@localhost/mydatabase
- 应用
# 导入
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()
这里应该会进行报错了,具体怎么解决我到时在补上.
如果到这一步,我们在命令行界面中没有看到报错信息,则数据库创建成功.