DAY5 MySQL数据库项目想关表的建立和导入测试数据和表的讲解
数据库表的建立
完成主页的渲染之后,我们就要处理我么后台的MySQL数据库了,这个项目的所有表的建立使用了我们flask框架中ORM(对象关系映射),既通过创建模型类的形式来创建我们
所需要的数据表来存储我们需要保存的数据以及相关表间关系的处理。
在项目中所有表的模型类是单独存放在一个文件里面的,我们在项目的info文件夹下建一个新的文件models,里面存放我们这次项目所需的所有模型类。
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
from info import constants
from . import db
class BaseModel(object):
"""模型基类,为每个模型补充创建时间与更新时间"""
create_time = db.Column(db.DateTime, default=datetime.now) # 记录的创建时间
update_time = db.Column(db.DateTime, default=datetime.now, onupdate=datetime.now) # 记录的更新时间
# 用户收藏表,建立用户与其收藏新闻多对多的关系
tb_user_collection = db.Table(
"info_user_collection",
db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True), # 新闻编号
db.Column("news_id", db.Integer, db.ForeignKey("info_news.id"), primary_key=True), # 分类编号
db.Column("create_time", db.DateTime, default=datetime.now) # 收藏创建时间
)
tb_user_follows = db.Table(
"info_user_fans",
db.Column('follower_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True), # 粉丝id
db.Column('followed_id', db.Integer, db.ForeignKey('info_user.id'), primary_key=True) # 被关注人的id
)
class User(BaseModel, db.Model):
"""用户"""
__tablename__ = "info_user"
id = db.Column(db.Integer, primary_key=True) # 用户编号
nick_name = db.Column(db.String(32), unique=True, nullable=False) # 用户昵称
password_hash = db.Column(db.String(128), nullable=False) # 加密的密码
mobile = db.Column(db.String(11), unique=True, nullable=False) # 手机号
avatar_url = db.Column(db.String(256)) # 用户头像路径
last_login = db.Column(db.DateTime, default=datetime.now) # 最后一次登录时间
is_admin = db.Column(db.Boolean, default=False)
signature = db.Column(db.String(512)) # 用户签名
gender = db.Column( # 订单的状态
db.Enum(
"MAN", # 男
"WOMAN" # 女
),
default="MAN")
# 当前用户收藏的所有新闻
collection_news = db.relationship("News", secondary=tb_user_collection, lazy="dynamic") # 用户收藏的新闻
# 用户所有的粉丝,添加了反向引用followed,代表用户都关注了哪些人
followers = db.relationship('User',
secondary=tb_user_follows,
primaryjoin=id == tb_user_follows.c.followed_id,
secondaryjoin=id == tb_user_follows.c.follower_id,
backref=db.backref('followed', lazy='dynamic'),
lazy='dynamic')
# 当前用户所发布的新闻
news_list = db.relationship('News', backref='user', lazy='dynamic')
def to_dict(self):
resp_dict = {
"id": self.id,
"nick_name": self.nick_name,
"avatar_url": constants.QINIU_DOMIN_PREFIX + self.avatar_url if self.avatar_url else "",
"mobile": self.mobile,
"gender": self.gender if self.gender else "MAN",
"signature": self.signature if self.signature else "",
"followers_count": self.followers.count(),
"news_count": self.news_list.count()
}
return resp_dict
def to_admin_dict(self):
resp_dict = {
"id": self.id,
"nick_name": self.nick_name,
"mobile": self.mobile,
"register": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"last_login": self.last_login.strftime("%Y-%m-%d %H:%M:%S"),
}
return resp_dict
class News(BaseModel, db.Model):
"""新闻"""
__tablename__ = "info_news"
id = db.Column(db.Integer, primary_key=True) # 新闻编号
title = db.Column(db.String(256), nullable=False) # 新闻标题
source = db.Column(db.String(64), nullable=False) # 新闻来源
digest = db.Column(db.String(512), nullable=False) # 新闻摘要
content = db.Column(db.Text, nullable=False) # 新闻内容
clicks = db.Column(db.Integer, default=0) # 浏览量
index_image_url = db.Column(db.String(256)) # 新闻列表图片路径
category_id = db.Column(db.Integer, db.ForeignKey("info_category.id"))
user_id = db.Column(db.Integer, db.ForeignKey("info_user.id")) # 当前新闻的作者id
status = db.Column(db.Integer, default=0) # 当前新闻状态 如果为0代表审核通过,1代表审核中,-1代表审核不通过
reason = db.Column(db.String(256)) # 未通过原因,status = -1 的时候使用
# 当前新闻的所有评论
comments = db.relationship("Comment", lazy="dynamic")
def to_review_dict(self):
resp_dict = {
"id": self.id,
"title": self.title,
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"status": self.status,
"reason": self.reason if self.reason else ""
}
return resp_dict
def to_basic_dict(self):
resp_dict = {
"id": self.id,
"title": self.title,
"source": self.source,
"digest": self.digest,
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"index_image_url": self.index_image_url,
"clicks": self.clicks,
}
return resp_dict
def to_dict(self):
resp_dict = {
"id": self.id,
"title": self.title,
"source": self.source,
"digest": self.digest,
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"content": self.content,
"comments_count": self.comments.count(),
"clicks": self.clicks,
"category": self.category.to_dict(),
"index_image_url": self.index_image_url,
"author": self.user.to_dict() if self.user else None
}
return resp_dict
class Comment(BaseModel, db.Model):
"""评论"""
__tablename__ = "info_comment"
id = db.Column(db.Integer, primary_key=True) # 评论编号
user_id = db.Column(db.Integer, db.ForeignKey("info_user.id"), nullable=False) # 用户id
news_id = db.Column(db.Integer, db.ForeignKey("info_news.id"), nullable=False) # 新闻id
content = db.Column(db.Text, nullable=False) # 评论内容
parent_id = db.Column(db.Integer, db.ForeignKey("info_comment.id")) # 父评论id
parent = db.relationship("Comment", remote_side=[id]) # 自关联
like_count = db.Column(db.Integer, default=0) # 点赞条数
def to_dict(self):
resp_dict = {
"id": self.id,
"create_time": self.create_time.strftime("%Y-%m-%d %H:%M:%S"),
"content": self.content,
"parent": self.parent.to_dict() if self.parent else None,
"user": User.query.get(self.user_id).to_dict(),
"news_id": self.news_id,
"like_count": self.like_count
}
return resp_dict
class CommentLike(BaseModel, db.Model):
"""评论点赞"""
__tablename__ = "info_comment_like"
comment_id = db.Column("comment_id", db.Integer, db.ForeignKey("info_comment.id"), primary_key=True) # 评论编号
user_id = db.Column("user_id", db.Integer, db.ForeignKey("info_user.id"), primary_key=True) # 用户编号
class Category(BaseModel, db.Model):
"""新闻分类"""
__tablename__ = "info_category"
id = db.Column(db.Integer, primary_key=True) # 分类编号
name = db.Column(db.String(64), nullable=False) # 分类名
news_list = db.relationship('News', backref='category', lazy='dynamic')
def to_dict(self):
resp_dict = {
"id": self.id,
"name": self.name
}
return resp_dict
下一步我们将使用这个文件生成我们在MySQL数据库中存放数据的表:
首先我们需要将我们的models文件导入到主文件中执行:
因为这里我是只是单独的让文件执行不是使用,所以是灰色的,没有关系,下一步输入脚本命令
因为我们之前已经连接好了数据库并进行数据库迁移文件夹的生成:
所以我们这次要建立所有的表并生成最初始版本记录:
在pycharm自带的命令控制台输入
脚本代码为:
python manage.py mysql migrate -m"init"(-m后面的内容为本次生成版本的注释,init为初始化
INFO 的内容为我们所建立的表的名字,done表示已经生成了最开始的版本号,现在打开我们的迁移文件夹会发现有一个新的
文件,里面就是本次我们所执行的内容,但是数据库里面还是没有建立我们所有的表,我们需要将数据库更新到本次版本,
使用下面的脚本代码:
python manage.py mysql upgrade (升版本)
执行后我们的数据库就建立好了,通过pycharm的可视化数据库就可以查看我们所有的数据表:
第一个为我们的版本表,里面是我们每次操作表的版本号。
下面我们在表里存放测试数据来测试一下是否存在乱码问题。
打开我们的MySQL提示符进入到项目数据库并进行查看:
下面我们插入我们的测试数据,我们将以数据文件的形式来进行操作
这里我们插入的表是新闻的标题表以及存放新闻的新闻表,它们之间存在着一对多的关系,所以在多的一方有着多的一方外键的数据,也就是ID,所以
要先插入标题表的数据再插入新闻表
source 命令代码 然后再将插入的数据文件直接用鼠标拖到后面,会自动补全文件的绝对路径,保存的时候尽量不要在路径中出现中文
然后再是新闻:
然后在我们的pycharm的可视化数据库中进行插入数据的查看,看是否有乱码:
OK,没有乱码,我们的项目的所有表的建立和运行就没有问题了,下一步我们做一个简单的表间关系的分析,以及表的建立数量和表的名字
表的分析
一个项目所需那些表需要我们自己通过项目前端页面,也就是前端所需的所有数据来进行分析,这是一个从无到有的过程,
需要我们仔细的分析,有可能初次考虑的不全,后面慢慢补全就行,
打开我们项目的前端页面:
这里我简单的分析一下,后面会有详细 的关系图,这里只是我自己的分析:
首先有存放新闻的表 ,然后是存放新闻分类的表,它们之间的一对多的关系,一是分类,多是新闻,所以新闻应该有
分类ID的外键存在,这样这两张表的关系就完成了,点击排行也是新闻,所以不需要单独的表,新闻表就可以存
然后是用户数据表,,这就是最基础的三张表,如下图还剩下4张表,我简单的分析一下吧:
User_Fans:用户和用户之间还存在着关注和被关注的关系,这是一个多对多关系,既一个人能被多个人关注,也能关注多个人。所以有User_Fans表来维持它们之间的关系
里面也就只需要存放用户的相关用户的id即可.
User_Collection:用户和新闻之间的第三表,用户收藏新闻以及新闻被用户收藏,多对多。(其实用户也可以写新闻,所以还存在着一对多,所以新闻里user_id也是一个外键。)
Comment:新闻评论表,一个新闻可以有多条新闻,但是每个新闻的评论区是不同的,所以是一对多的关系。所以存放评论的评论表里有新闻的ID这个外键,用户来进行评论所以也有用户的ID外键
comment_like:用户点赞表,评论相关的表的分析我还暂时没有懂,后续懂了之后再做分析吧。现在先简单的分析到这。
原文地址:https://www.cnblogs.com/a1551/p/15395263.html
- WordPress.com 宣布支持Markdown 语言
- 使用Topshelf 5步创建Windows 服务
- TGM Plugin Activation:为WordPress 主题添加“插件推荐安装”功能
- [腾讯社区开放平台]介绍开放授权协议-OAuth
- HTML5规范的本地存储
- ASP.NET Web API 处理架构
- ASP.NET MVC 4中的单页面应用程序
- [信息安全] 4.一次性密码 && 身份认证三要素
- 拥抱大数据时代
- 腾讯社区开放平台.NET SDK在Mono下运行
- Redis Web界面管理工具
- [信息安全] 3.HTTPS工作流程
- 初探css3
- QQ互联OAuth2.0 .NET SDK 发布以及网站QQ登陆示例代码
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- Laravel框架实现的使用smtp发送邮件功能示例
- 浅谈PHP无限极分类原理
- 浅谈PHP各环境下的伪静态配置
- 浅谈php的TS和NTS的区别
- 详解用Python调用百度地图正/逆地理编码API
- python如何使用代码运行助手
- keras topN显示,自编写代码案例
- PHP实现的杨辉三角求解算法分析
- PHP levenshtein()函数用法讲解
- PHP DB 数据库连接类定义与用法示例
- PHP添加PNG图片背景透明水印操作类定义与用法示例
- 浅谈PHPANALYSIS提取关键字
- 详解PHP队列的实现
- PHP lcfirst()函数定义与用法
- Qt音视频开发38-USB摄像头解码linux方案