postgresql - 为什么我的 postgresql 函数插入回滚?
问题描述
我有以下功能:
CREATE OR REPLACE FUNCTION "Sensor"."PersistTelemetry"(sid character varying, measurement character varying, val numeric, ts character varying)
RETURNS boolean
LANGUAGE 'plpgsql'
VOLATILE
COST 100
AS $BODY$DECLARE SUCCESS BOOLEAN;
BEGIN
BEGIN
SUCCESS = false;
INSERT INTO
"Sensor"."SensorReadings" (
sensorid,
reservoirid,
timestamp,
measurement,
value
)
VALUES
(
sid,
(
SELECT
reservoirid
FROM
"Sensor"."SystemSensors"
WHERE
sensorid = sid
),
to_timestamp(ts, 'YYYY/MM/DD hh24:mi:ss'),
measurement,
val
);
SUCCESS = true;
EXCEPTION WHEN OTHERS THEN
SUCCESS = false;
RAISE NOTICE 'ErError % %', SQLERRM, SQLSTATE;
END;
RETURN SUCCESS;
END; $BODY$;
我用 flask-sqlalchemy 调用它,执行和有效负载如下:
@app.route('/api/telemetry', methods=['POST'])
def persist_telemetry():
if not request.json:
abort(400)
sensorID = request.json['sensorID']
measurement = request.json['measurement']
value = request.json['value']
timestamp = request.json['timestamp']
params = {
'sensorid' : sensorID,
'measurement' : measurement,
'val' : value,
'ts' : timestamp
}
print(params)
result = db.session.execute("""select "Sensor"."PersistTelemetry"(:sensorid, :measurement, :val, :ts)""", params)
for r in result:
print(r)
return "success", 201
{'val': 8.8, 'sensorid': 'phSensorA.haoshiAnalogPh', 'ts': '2019-12-06 18:32:36', 'measurement': 'ph'}
我已经在我的服务器上启用了日志记录,并设置log_min_messages=notice
了但是在查看日志时,我看到的是:
2019-12-07 02:17:00 CST [14757-15] moedepi@SnooSongFarms LOG: statement: BEGIN
2019-12-07 02:17:00 CST [14757-16] moedepi@SnooSongFarms LOG: statement: select "Sensor"."PersistTelemetry"('phSensorA.haoshiAnalogPh', 'ph', 8.8, '2019-12-06 18:32:36')
2019-12-07 02:17:00 CST [14757-17] moedepi@SnooSongFarms LOG: statement: ROLLBACK
该函数返回 true,并且我在日志中没有看到字符串“ ErError ”,所以这告诉我没有引发异常。
什么可能导致此插入回滚?我该如何进一步调试呢?
任何帮助深表感谢。
解决方案
日志消息表明PG端没有错误。事务序列号 ( 14757-15/16/17
) 表示会话中没有调用其他查询,因此在应用程序端闻起来像是一些不良行为。可能是您关闭了自动提交,并且您在未提交的情况下关闭了连接。为了解决这个问题,您需要添加一个db.session.commit
披露:我为EnterpriseDB (EDB)工作
推荐阅读
- matlab - matlab中“内存不足”错误的解决方法
- selenium-webdriver - 从渲染器接收消息超时:9.999,截屏时
- python - 神经网络首先找到最佳超参数或架构
- tensorflow - AttributeError:模块“tensorflow.estimator”没有属性“SessionRunHook”
- xml - 命名空间问题
- javascript - 带有谷歌地图的 Ionic 3:地图未显示
- java - 用公式 N^R 的所有组合填充数组
- android - 我去手机设置,修改了一个权限,如何让应用重启,回到MainActivity?
- vb.net - 按变量值打开表单
- windows - Windows 中是否有一个选项可以创建一个包含在 RAM 中的字节的文件?