首页 > 编程问答 >关于 python 循环和 sqlalchemy

关于 python 循环和 sqlalchemy

时间:2024-05-31 11:27:57浏览次数:15  
标签:python sqlalchemy

def getBeforePoint(userId):
    today = datetime.now()

    子查询 = (
        db.session.query(
            T_user_point.acquired_at、
            M_promotion_code.valid_days、
            T_user_promotion_code.promotion_code_id、
            T_user_point.user_promotion_code_id、
            T_user_promotion_code.user_promotion_code_id、
        )
        .join(T_user_promotion_code, T_user_point.user_promotion_code_id == T_user_promotion_code.user_promotion_code_id)
        .join(M_promotion_code, T_user_promotion_code.promotion_code_id == M_promotion_code.promotion_code_id)
        .filter(T_user_point.user_id == userId)
        .subquery()
    )

 
    result = db.session.query(
        subquery.c.acquired_at、
        subquery.c.valid_days
    ).all()

    loop_counter = 0
    point_with_valid_days = 0
    for row in result:
        acquired_at = row.acquired_at
        valid_days = row.valid_days

        如果 valid_days 不是 None,则
            valid_duration = timedelta(days=valid_days)
            expiration_date = acquired_at + timedelta(days=valid_days)
            point_expiration_date = func.cast(acquired_at + timedelta(days=valid_days), DATE)
            if today < expiration_date:
                point_with_valid_days = (
                    db.session.query(func.sum(T_user_point.point))
                    .join(subquery, T_user_point.user_promotion_code_id == subquery.c.user_promotion_code_id)
                    .filter(
                        T_user_point.user_id == userId、
                        T_user_point.is_deleted == False、
                        subquery.c.valid_days.isnot(None)、
                        今天 < point_expiration_date、
                        T_user_point.user_promotion_code_id == T_user_promotion_code.user_promotion_code_id
                    )
                    .scalar() 或 0
                )
            否则:
                point_with_valid_days += 0

            loop_counter += 1
            print('point_with_valid_days', point_with_valid_days)

数据库中有 50 个积分的有效期已过(point_expiration_date 为 False),10 个积分的有效期未过(point_expiration_date 为 True)。

在上面的代码中,我以为 print('point_with_valid_days', point_with_valid_days) 将打印 10,但实际上它打印了 60。

我不知道我在代码中做错了什么。 谁能帮我找出代码中的错误?


你代码的主要问题在于循环内部对 point_with_valid_days 的处理方式。你每次循环都会重新计算 point_with_valid_days 的值,而不是累加它。这就是为什么你最终得到 60 而不是 10 的原因。

以下是你的代码存在的问题的详细解释:

  1. 循环内部重复计算: 在你的循环中,每次迭代都会执行 db.session.query(...) 来计算 point_with_valid_days。 即使当前积分的有效期已过,查询也会执行,并将之前所有有效积分的总和赋值给 point_with_valid_days

  2. 未累加有效积分:否则: 分支中,你只是简单地将 0 加到 point_with_valid_days 上,而不是累加之前循环中计算出的有效积分。

为了解决这些问题,你需要修改循环内部的逻辑,以便只在积分有效时累加 point_with_valid_days 的值。

以下是修改后的代码:

def getBeforePoint(userId):
    today = datetime.now()

    # ... (子查询代码不变) ...

    result = db.session.query(
        subquery.c.acquired_at,
        subquery.c.valid_days
    ).all()

    loop_counter = 0
    point_with_valid_days = 0  # 初始化总有效积分

    for row in result:
        acquired_at = row.acquired_at
        valid_days = row.valid_days

        if valid_days is not None:
            expiration_date = acquired_at + timedelta(days=valid_days)
            point_expiration_date = func.cast(expiration_date, DATE) 

            # 只在积分有效时计算并累加
            if today < expiration_date:
                valid_points = (
                    db.session.query(func.sum(T_user_point.point))
                    .join(subquery, T_user_point.user_promotion_code_id == subquery.c.user_promotion_code_id)
                    .filter(
                        T_user_point.user_id == userId,
                        T_user_point.is_deleted == False,
                        subquery.c.valid_days.isnot(None),
                        today < point_expiration_date,
                        T_user_point.user_promotion_code_id == T_user_promotion_code.user_promotion_code_id
                    )
                    .scalar() or 0
                )
                point_with_valid_days += valid_points  # 累加有效积分

            loop_counter += 1
            print('point_with_valid_days', point_with_valid_days)

    return point_with_valid_days # 返回总有效积分

通过以上修改,你的代码现在应该能够正确计算并返回用户的有效积分总和了。

标签:python,sqlalchemy
From: 78557977

相关文章

  • Python 入门之阅目的 Pythonic(一)
    #免责声明:本文内容主要是肥清大神的视频以及自己收集学习内容的整理笔记,目是主要是为了让象博主这样的老白能更好的学习编号,如有侵权,请联系博主进行删除。1.注释#注释<Comments>:用来向用户提示或解释某些代码的作用和功能*可以出现在代码中的任何位置*Py......
  • pip is configured with locations that require TLS/SSL, however the ssl module in
     [root@dsc1mydjango]#pip3installdjangopipisconfiguredwithlocationsthatrequireTLS/SSL,howeverthesslmoduleinPythonisnotavailable.CollectingdjangoRetrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))after......
  • Python——聊天机器人
    前端代码1#导入需要的包和库2fromchatterbotimportChatBot3fromchatterbot.trainersimportListTrainer,ChatterBotCorpusTrainer4fromflaskimportFlask,render_template,request56#创建Flask应用7app=Flask(__name__)89#创建一个聊......
  • 【Python快速上手(三十四)】- Python math 模块
    目录Python快速上手(三十四)-Pythonmath模块Pythonmath模块详解1.导入math模块2.基本数学运算3.三角函数4.双曲函数5.特殊函数6.浮点运算辅助函数7.常量8.实际应用案例9.小结Python快速上手(三十四)-Pythonmath模块Pythonmath模块详解math模块......
  • 数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGB
    全文链接:https://tecdat.cn/?p=34434原文出处:拓端数据部落公众号分析师:ShilinChen离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。解决方案任务/目标采用分类这一方法构建6种模型对职......
  • Python实训的心路历程——第4天
    时间过得好快,转眼就第四天了,今天还是接着做界面,并往里面添加内容。========================================一天又过去了,但是每天都感觉自己成长了好多呢,哈哈来汇总一下今天的工作和收获今天把界面和一些基础的功能写完了,程序能正常跑了,可以处理实时摄像头、视频、图片三种......
  • Python信贷风控模型:梯度提升Adaboost,XGBoost,SGD, GBOOST, SVC,随机森林, KNN预测金
    原文链接:http://tecdat.cn/?p=26184 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于信贷风控模型的研究报告,包括一些图形和统计输出。在此数据集中,我们必须预测信贷的违约支付,并找出哪些变量是违约支付的最强预测因子?以及不同人口统计学变量的类别,拖欠还款的概率如何......
  • Python selenium webdriver
    元素定位第一步,导入selenium模块的webdrivier包importtimefromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy窗口最大化driver=maximize_window()第二步,调用webdriver包的Chrome类,返回chrome浏览器对象driver=webdriver.Chrome()第三步,如使用......
  • python连接数据库
    一#删除数据库importpymysqlmydb=pymysql.connect(host="localhost",user="root",password="000000",database="my_db")mycursor=mydb.cursor()sql="DROPDATABASEIFEXISTSmy_db"mycursor.execute(sql)m......
  • 「Python魔法药剂:列表推导式的秘密配方大公开!」(一)
    嗨,我是阿佑,最近给大家打开了python操作数据库的大门,今天阿佑将为你揭开列表推导式这个秘密配方的神秘面纱。通过一系列生动有趣的案例和深入浅出的解释,阿佑将带你领略列表推导式的无穷魅力。准备好了吗?让我们一起调配出最强大的编程药剂,让你的代码魔法无人能敌!文章目录......