python - 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%)运行余额更新由于以下错误而失败:
- 错误:检测到死锁。
- 进程 7038 等待事务 5549 上的 ShareLock;被进程 7036 阻止。
- 进程 7036 等待事务 5551 上的 ShareLock;被进程 7038 阻止。
我想知道是否有更好的方法来做到这一点?我最初想将运行余额字段定义为 Django 模型中的计算字段,但我无法弄清楚如何定义它以使其达到与上面代码相同的结果。任何帮助,将不胜感激。
谢谢。
解决方案
推荐阅读
- python - Lambda:如何遍历/循环 SNS 主题以获取所有主题属性?
- php - session_cache_limiter(false) 有什么作用?
- python - 如何在不刷新页面的情况下从数据库中删除和对象?
- sql - SAP B1中如何查询仓库的分店?
- python - MultiComparision.tukeyhsd() 的类型错误
- javascript - 通过ajax将表单数据传递给spring控制器;总是得到 404 错误
- jmx-exporter - 如何解决我的 config.yaml 中的意外 ':' 错误?
- python - 早期数据科学项目的有用结构(jupyter notebooks)
- pdflib - PDFlib - 修剪页面
- angular - 使用公共类来保存静态数据