首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Flask-SQLAlchemy循环事务

Flask-SQLAlchemy循环事务
EN

Stack Overflow用户
提问于 2021-07-04 22:08:00
回答 1查看 68关注 0票数 0

我正在构建一个钱包余额管理系统。我在Python3.8中使用Flask-SQLAlchemy。在这种情况下,我需要在循环中添加多个产品(我已经简化了函数)。对于添加的每个产品,我首先创建一个事务处理行,然后在不同的表中创建一个产品行。

在完成循环之后,我从钱包中减少了总价格。我检查新余额是否大于0,否则取消交易(所有添加的行和钱包操作)。

现在,循环部分工作得很好。但是user.balance = user.balance - price不会被执行。user是我从get_user_details获得的一个数据库对象。

没有错误。我遗漏了什么?

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2021-07-04 22:22:06

session.flush()向数据库传递一系列操作(插入、更新、删除)。数据库将它们作为事务中的挂起操作进行维护。在数据库收到当前事务的提交之前,这些更改不会永久保存到磁盘上,也不会对其他事务可见(这就是session.commit()所做的)。

您是否可以先尝试提交,然后使用user.balance = user.balance - price?

就像这样。

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68245537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档