首页 > 解决方案 > Django 计算运行平衡

问题描述

我正在使用 Django(创建基于 API 的后端)开发个人理财应用程序。我有一个交易表,我需要在其中维护基于 UserID、AccountID、TransactionDate 的运行余额。创建、更新或删除交易后,我需要更新运行余额。我确定的当前方法是运行自定义 SQL 语句,一旦完成上述操作之一来更新此字段,我就会调用该语句(请参见下面的代码):

def update_transactions_running_balance(**kwargs):
    from django.db import connection


    querystring = '''UPDATE transactions_transactions 
    SET 
        transaction_running_balance = running_balance_calc.calc_running_balance 
    FROM 
        (SELECT 
            transaction_id, 
            transaction_user, 
            transaction_account, 
            SUM(transaction_amount_account_currency) OVER (ORDER BY transaction_user, transaction_account, transaction_date ASC, transaction_id ASC) as calc_running_balance 
        FROM 
            transactions_transactions 
        WHERE 
            transaction_user = {} 
            AND 
            transaction_account = {}) as running_balance_calc 
    WHERE 
        transactions_transactions.transaction_id = running_balance_calc.transaction_id  
        AND 
        transactions_transactions.transaction_user = running_balance_calc.transaction_user 
        AND 
        transactions_transactions.transaction_account = running_balance_calc.transaction_account'''.format(int(kwargs['transaction_user']), int(kwargs['transaction_account']))

    with connection.cursor() as cursor:
        cursor.execute(querystring)

但是我遇到的问题是,一旦表变大一点,响应时间就会开始增加(SELECT 语句是花费时间的地方)。我遇到的另一个问题是,当我使用多个并发创建事务加载服务器时,每隔一段时间(当前速率为 0.25%)运行余额更新由于以下错误而失败:

我想知道是否有更好的方法来做到这一点?我最初想将运行余额字段定义为 Django 模型中的计算字段,但我无法弄清楚如何定义它以使其达到与上面代码相​​同的结果。任何帮助,将不胜感激。

谢谢。

标签: pythondjango

解决方案


推荐阅读