这一部分主要介绍博客的数据库以及定义的常用的查询函数,这一部分代码主要在model.py里面。博客的数据库主要包含category,tag,tags,post,comment五张表。现在分别对这五张表以及相关的查询函数进行解析:
-
category
category(分类表),主要储存了博客的分类,表项只有id(自增)以及name(唯一).
class Category(db.Model): __tablename__ = 'category' #表名 query_class = CategoryQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id category_name = db.Column(db.String(200), unique=True) #name #下面的内容可以自由选择 def __init__(self, category_name): self.category_name = category_name def __repr__(self): return '' % self.category_name
查询只要定义了两个函数getall以及getcategory_id:getall()获取所有的分类,getcategory_id(id)获取指定id
的分类。
class CategoryQuery(BaseQuery): def getall(self): return self.all() def getcategory_id(self, id): return self.get(id)
-
tags
tags(文章标签映射表),主要存储了文章id与标签的id的对应关系,存储文章的时候,该表会自动进行更新。
article_tags = db.Table('tags', db.Column( 'tag_id', db.Integer, db.ForeignKey('tag.id')), db.Column( 'post_id', db.Integer, db.ForeignKey('post.id')), )
-
tag
tag(标签表),主要存储了文章的标签,表只有id(自增)以及name。
class Tag(db.Model): __tablename__ = 'tag' #表名 query_class = TagQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id name = db.Column(db.String(50)) #name def __init__(self, name): self.name = name def __repr__(self): return '' % self.name
查询只要定义了两个函数getall以及gettag_id:getall()获取所有的标签,gettag_id(id)获取指定id
的标签。
class TagQuery(BaseQuery): def getall(self): return self.all() def gettag_id(self, id): return self.get(id)
-
post
post(文章表),主要存储了博客的文章内容以及相关的分类以及标签信息,表只有id(自增)、post_content、post_title、post_create_time、view_num、comment_count、status、author_id、post_modified_time、category_id、post_name、tags_name(id,文章内容,文章标题,文章创建时间,阅读次数,评论数量,文章状态,作者id,文章修改时间,分类id,网址的缩写名称,标签名称)。
class Post(db.Model): __tablename__ = 'post' #表名 query_class = PostQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id post_content = db.Column(db.Text) #文章内容 post_title = db.Column(db.String(100)) #文章标题 post_name = db.Column(db.String(200), unique=True) #文章的网址的缩写,主要用于文章的网址以便于SEO优化 post_create_time = db.Column(db.DateTime, default=datetime.utcnow) #文章创建时间 view_num = db.Column(db.Integer, default=0) #阅读次数 comment_count = db.Column(db.Integer, default=0) #评论次数 status = db.Column(db.Integer, default=1) #文章状态 author_id = db.Column(db.Integer, default=1) #作者id,默认是1 post_modified_time = db.Column(db.DateTime, default=datetime.utcnow) #文章的修改时间 category_id = db.Column(db.Integer, db.ForeignKey('category.id')) #类型id categorys = db.relationship('Category', backref=db.backref( 'posts', lazy='dynamic'), lazy='select') #定义与category表之间的关系 tags = db.relationship('Tag', secondary=article_tags, backref=db.backref('posts', lazy='dynamic')) #定义域tag表之间的关系 def __init__(self, tags, post_content, post_title, category_id, post_name, post_create_time=None, view_num=0, comment_count=0, status=1, author_id=1, post_modified_time=None): self.post_content = post_content self.post_title = post_title self.category_id = category_id self.post_name = post_name if post_create_time is None: self.post_create_time = datetime.utcnow() self.view_num = view_num self.comment_count = comment_count self.status = status self.author_id = author_id if post_modified_time is None: self.post_modified_time = post_modified_time self.tags = tags def __repr__(self): return '' % self.post_title def _url(self): return url_for('post', name=self.post_name) @cached_property def url(self): return self._url() @cached_property def comments(self): allcomments = Comment.query.filter(Comment.post_id == self.id).all() return allcomments
查询定义了七个函数:getpost_id、getall、getpost_byname、getpost_perpage、hottest、newpost、search:
getpost_id(id):获取指定id的文章;
getall():获取所有的文章;
getpost_byname(name):获取指定postname的文章;
getpost_perpage():用于分页显示所有文章;
hottest():根据浏览次数以及评论次数来排序文章;
newpost():根据文章修改时间来排序文章;
search():查找函数,主要用于标题,内容,标题以及类别。
class PostQuery(BaseQuery): def getpost_id(self, id): return self.get(id) def getall(self): return self.all() def getpost_byname(self, name): return self.filter(Post.post_name.ilike(name)).distinct().first() def getpost_perpage(self, pageid, per_page): return self.order_by(Post.post_modified_time.desc(), Post.post_create_time.desc()).paginate(pageid, per_page) def hottest(self): return self.order_by(Post.comment_count.desc(), Post.view_num.desc()) def newpost(self): return self.order_by(Post.post_create_time.desc()) def search(self, keywords): criteria = [] for keyword in keywords.split(): keyword = '%' + keyword + '%' criteria.append(db.or_(Post.post_title.ilike(keyword), Post.post_content.ilike(keyword))) q = reduce(db.and_, criteria) return self.filter(q).distinct()
-
comment
comment(评论表),主要存储评论相关信息,表项有:id,post_id,author,author_email,author_url,author_ip,comment_create_time,content,isvisible。
class Comment(db.Model): __tablename__ = 'comment' #表名 query_class = CommentQuery #指定的查询类名 id = db.Column(db.Integer, primary_key=True) #id post_id = db.Column(db.Integer, db.ForeignKey('post.id')) #文章id posts = db.relationship('Post', backref=db.backref('comments', lazy='dynamic')) #定义post与comment之间的关系 author = db.Column(db.String(50)) #作者名 author_email = db.Column(db.String(100)) #作者email author_url = db.Column(db.String(1024)) #作者url author_ip = db.Column(db.String(20)) #作者ip comment_create_time = db.Column(db.DateTime, default=datetime.utcnow) #评论创建时间 content = db.Column(db.Text) #评论内容 isvisible = db.Column(db.Integer, default=1) #评论是否可见 def __init__(self, postid, author, author_email, author_url, author_ip, content, isvisible=1, comment_create_time=None): self.post_id = postid self.author = author self.author_email = author_email self.author_url = author_url self.author_ip = author_ip self.content = content self.isvisible = isvisible if comment_create_time is None: self.comment_create_time = datetime.utcnow() def __repr__(self): return '' % self.content
查询定义了三个函数:getall,getcomment_id以及newcomment。
class CommentQuery(BaseQuery): def getall(self): return self.all() def getcomment_id(self, id): return self.get(id) def newcomment(self): return self.order_by(Comment.comment_create_time.desc())