我正在构建一个从一个服务接收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'
我总是得到最新的数据,我错过了什么?
答案 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'