我正在构建一个钱包余额管理系统。我在Python3.8中使用Flask-SQLAlchemy。在这种情况下,我需要在循环中添加多个产品(我已经简化了函数)。对于添加的每个产品,我首先创建一个事务处理行,然后在不同的表中创建一个产品行。
在完成循环之后,我从钱包中减少了总价格。我检查新余额是否大于0,否则取消交易(所有添加的行和钱包操作)。
现在,循环部分工作得很好。但是user.balance = user.balance - price不会被执行。user是我从get_user_details获得的一个数据库对象。
没有错误。我遗漏了什么?
def put_data(data, pproduct, price):
user = get_user_details()
multi_product = data.get(MULTI_PR, 1) if data.get(MULTI_PR, 1) != -1 else 1
product_number = int(get_product_num(pproduct))
# Start transaction
db.session.begin()
for index, product_id in enumerate(list(range(product_number, product_number + multi_product))):
transaction_id = gen_trn_uid()
transaction = transactions.Transaction()
transaction.transaction_id = transaction_id
transaction.status = "init"
transaction.user_id = user.id
transaction.sum = price / multi_product
transaction.transaction_date = datetime.now()
db.session.add(transaction)
db.session.flush()
product = game_products.ProductForm()
product.product = pproduct
product.data = str(data)
product.status = 'init'
product.time = datetime.now()
product.user_id = user.id
games_form.product_number = product_id
product.transaction_id = transaction.id
db.session.add(product)
db.session.flush()
user.balance = user.balance - price
db.session.flush()
if user.balance < 0:
db.session.rollback()
raise HTTPException(HTTPStatus.PAYMENT_REQUIRED, 'insufficient balance',
name='Err 713')
db.session.commit()发布于 2021-07-04 22:22:06
session.flush()向数据库传递一系列操作(插入、更新、删除)。数据库将它们作为事务中的挂起操作进行维护。在数据库收到当前事务的提交之前,这些更改不会永久保存到磁盘上,也不会对其他事务可见(这就是session.commit()所做的)。
您是否可以先尝试提交,然后使用user.balance = user.balance - price?
就像这样。
def put_data(data, pproduct, price):
user = get_user_details()
multi_product = data.get(MULTI_PR, 1) if data.get(MULTI_PR, 1) != -1 else 1
product_number = int(get_product_num(pproduct))
# Start transaction
db.session.begin()
for index, product_id in enumerate(list(range(product_number, product_number + multi_product))):
transaction_id = gen_trn_uid()
transaction = transactions.Transaction()
transaction.transaction_id = transaction_id
transaction.status = "init"
transaction.user_id = user.id
transaction.sum = price / multi_product
transaction.transaction_date = datetime.now()
db.session.add(transaction)
db.session.flush()
product = game_products.ProductForm()
product.product = pproduct
product.data = str(data)
product.status = 'init'
product.time = datetime.now()
product.user_id = user.id
games_form.product_number = product_id
product.transaction_id = transaction.id
db.session.add(product)
db.session.flush()
db.session.commit()
user.balance = user.balance - price
if user.balance < 0:
db.session.rollback()
raise HTTPException(HTTPStatus.PAYMENT_REQUIRED, 'insufficient balance',
name='Err 713')
db.session.flush()
db.session.commit()https://stackoverflow.com/questions/68245537
复制相似问题