Flask-Sqlalchemy:数据库查询不会返回新数据

时间:2015-07-28 04:56:36

标签: python mysql flask flask-sqlalchemy

我正在构建一个从一个服务接收webhook的应用程序,将数据存储在数据库中,然后通过API提供数据。

我能够成功地将数据添加到我的应用程序中,但是当我查询数据库时,我只收到上次启动应用程序时数据库中的第一次提交。

例如,如果我在启动应用程序时在Orders表中有26个订单,然后触发webhook,Order.query.all()将返回27个订单,直到我重新启动应用程序,无论实际上有多少订单table(我可以使用MySQL验证)。

以下是用于将数据插入表中的类的示例:

@webhook.route('/order/insert', methods=['POST'])
def insert_orders():
    soda_json = request.json
    db.session.add(Order(
        order_id=soda_json['id'],  
        created_at=datetime.datetime.now(),
        currency=soda_json['currency'],
        total_line_items_price=soda_json['total_line_items_price'],
        refunds=sum(float(i) for i in soda_json['refunds'] if soda_json['refunds']),
        shipping_lines_price=sum([float(line['price']) for line in soda_json['shipping_lines']]),
        note=soda_json['note']
    ))
db.session.commit()
return '200'

这是我用于测试的基本API方法:

order_test = Order.query.all()

@api.route('/display', methods=['POST', 'GET'])
def display_test():
    return jsonify(json_list=[i.serialize for i in order_test]), '200'

我总是得到最新的数据,我错过了什么?

2 个答案:

答案 0 :(得分:4)

看起来查询中的方法顺序可能是一个问题。

from my_app.models import Order

order_test = Order.query.all()

这是教程中的结构(https://pythonhosted.org/Flask-SQLAlchemy/queries.html#querying-records),但似乎只能查看原始导入模型中的数据。随意纠正我。

在flask shell中的类似操作中,我在使用此查询结构提交后立即成功获取实时数据:

db.session.query([model]).all()

因此API方法的一个工作示例可能是:

@api.route('/display', methods=['POST', 'GET'])
def display_test():
    order_test = db.session.query(Order).all()
    return jsonify(json_list=[i.serialize for i in order_test]), '200'

答案 1 :(得分:0)

我可以看到的问题是,只有在启动该视图时才会填充 order_list 。因此,如果您将该行代码移动到路由调用中,则每次调用该路由时都会刷新该代码行。

e.g。

@api.route('/display', methods=['POST', 'GET'])
def display_test():
    order_test = Order.query.all()
    return jsonify(json_list=[i.serialize for i in order_test]), '200'

从你到目前为止所说的内容看来,无论新数据发送到Web挂钩多少次,你都只能向数据库添加一条新记录,如果重新启动API,那么你就是回到原点,新记录不再存在。

对我而言,在webhook中提交事务似乎是一个问题,因为在调用 db.session.add()之后,数据不会保存到数据库中,因此事务保持打开状态,因此当添加新数据时,它可能会覆盖前一次调用的数据,然后当您结束API时,事务是已提交回滚(可以& #39;记住flask-alchemy的默认动作。您可能需要检查数据本身,并在调用webhook后查看第51行中返回的数据,并查看新数据发送到webhook后是否发生更改。

如果你还比较上面的webhook代码和下面的提交和返回行是不同的。在你的不同标签行上,它们在webhook函数之外,并且在调用webhook时不会运行,因此会有一个打开的事务。

@webhook.route('/order/insert', methods=['POST'])
def insert_orders():
    soda_json = request.json
    db.session.add(Order(
        order_id=soda_json['id'],  
        created_at=datetime.datetime.now(),
        currency=soda_json['currency'],
        total_line_items_price=soda_json['total_line_items_price'],
        refunds=sum(float(i) for i in soda_json['refunds'] if soda_json['refunds']),
        shipping_lines_price=sum([float(line['price']) for line in soda_json['shipping_lines']]),
        note=soda_json['note']
    ))
    db.session.commit()
    return '200'