flask中实现数据分组&通过输出 SQL 语句辅助检查数据

文章讲述了如何在Flask应用中使用SQLAlchemy进行数据库的联合查询,特别是涉及到两个表的关联查询,以及如何按时间排序和分组显示数据。同时,讨论了日志调试中设置日志级别以查看SQL执行情况的问题,以及在分组查询时可能出现的数据丢失现象。
摘要由CSDN通过智能技术生成

【数据库模型类】

class ConColumn(db.Model):
    __tablename__='content_column'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50), nullable=False)
    pid = db.Column(db.Integer)
    parent_name = db.Column(db.String(50), nullable=False)
    ......

    # 和文章的关系
    articles = db.relationship('Article', backref="content_article")

class Article(db.Model):
    __tablename__ = 'content_article'
    id = db.Column(db.Integer, primary_key=True)
    #columnId = db.Column(db.String(11), nullable=False)
    photoUrl = db.Column(db.String(300))
    fileUrl = db.Column(db.String(300))
    create_time = db.Column(db.DateTime, default=datetime.now)
    ...... 

    # 外键
    columnId = db.Column(db.Integer, db.ForeignKey("content_column.id"), nullable=False)

想要在flask实现两个表联合查询,得到Article表的id,photoUrl,fileUrl,ConColumn表的name
按照Article的create_time倒排序,该如何写查询?

【循环展示】

目标:同一ConColumn的表的相同的name放在一行显示
2021(ConColumn表的name)
图片1(地址是photoUrl) 图片2(地址是photoUrl) 图片3(地址是photoUrl)
2020(ConColumn表的name)
图片1(地址是photoUrl) 图片2(地址是photoUrl) 图片3(地址是photoUrl)
2016(ConColumn表的name)
图片1(地址是photoUrl) 图片2(地址是photoUrl) 图片3(地址是photoUrl)

【数据库中的数据:】
22    11    学而思        0    ... ...
23    15    TSM            0    ... ...
24    16    CATL        0    ... ...
25    16    锦浪        0    ... ...
字段的顺序依次是id,columnId,title,detail,is_top,photoUrl,fileUrl  

class Article(db.Model):
    __tablename__ = 'content_article'
    id = db.Column(db.Integer, primary_key=True)
    ... 
    columnId = db.Column(db.Integer, db.ForeignKey("content_column.id"), nullable=False)
    
  def findArticleGroup(self, column_id):
        children_ids = [11, 12, 13, 14, 15, 16, 17]
        articles = (
            Article.query.join(ConColumn, Article.columnId == ConColumn.id)
            .filter(Article.columnId.in_(children_ids), Article.is_top == 0)
            .with_entities(Article.id,Article.photoUrl, Article.fileUrl, ConColumn.name)
            #.group_by(ConColumn.name)
            .order_by(Article.create_time.desc())
            .all()
        )

对应的sql

SELECT content_article.id AS content_article_id, content_article.`photoUrl` AS `content_article_photoUrl`, content_article.`fileUrl` AS `content_article_fileUrl`, content_column.name AS content_column_name 
FROM content_article INNER JOIN content_column ON content_article.`columnId` = content_column.id 
WHERE content_article.`columnId` IN (11,12,13,14,15,16,17) AND content_article.is_top = 0 
ORDER BY content_article.create_time DESC


        logging.getLogger('sqlalchemy.engine').setLevel(logging.DEBUG)  # 将日志级别设置为 debug
    【问题】 

        1.设置日志级别的语句是放在这里吗?然后在哪里查看日志
        2.这个分组查询中,符合条件的数据应该是4条,但是分组之后的数据把id=25的数据丢失了,不知什么原因。
        【回答】
        如果没有在控制台中看到 SQL 语句,那可能是你的日志级别设置过高了。这种情况下,重新设置日志级别即可,例如:
        
可以在控制台中查看 SQL 语句。关于查询中 id=25 的数据丢失的问题,应该是在分组查询中出了问题。请检查一下在查询的时候,是否漏选了某些条件,是否有其他查询导致该数据被过滤了掉等等。可以将 group_by(ConColumn.name) 语句删除掉试试看是否能查到 id=25 的数据,或者将 group_by 语句修改为 group_by(Article.id),以便更好地定位问题。        

import logging
logging.basicConfig()
logging.getLogger('sqlalchemy.engine').setLevel(logging.INFO) # 重新设置为 INFO 级别


这样就可以在控制台输出 SQL 语句了。如果仍然无法输出 SQL 语句,可能是数据库配置方面的问题,你可以查看你使用的数据库的文档,了解更多日志输出配置方面的信息。

【前端(vue)】 

  <div v-for="(item, index) in tableData" :key="index">

      <div class="MasonryList-title">{{ item.parentName }}</div>

      <div class="wrapper">

        <div v-for="(file, index) in item.files" :key="index">

          <div class="child">

            <img

              class="imgStyle"

              :src="file.categorieIcon"

              @click="getNewsDetail(file.fileUrl)"

            />

          </div>

        </div>

      </div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值