为什么我的 postgresql 函数插入回滚?

2024-04-25

我有以下功能:

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

披露:我为企业数据库(EDB) http://enterprisedb.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 postgresql 函数插入回滚? 的相关文章

随机推荐