首页 > 解决方案 > psycpg2 插入失败

问题描述

我得到了一些 python 代码(psycopg2),它应该将数据插入数据库:

def debug(self):
    try:

        self.connection.execute(
            "SELECT test();")
        res = self.connection.fetchall()
        print(res)

    except Exception as e:
        print(e)
    return

pgsql 中的 test() 函数是这样的:

CREATE OR REPLACE FUNCTION test(
) RETURNS setof varchar
AS $Body$
BEGIN
    INSERT INTO Linie(name) VALUES('3');
    RETURN QUERY(SELECT * FROM linie);
END;
$Body$ LANGUAGE plpgsql;

当我更改“名称”值并在 pgAdmin 中执行查询时,数据库中有一个 now 条目。但是,当从 python 调用函数时,它总是会覆盖该值。

该表定义如下:

CREATE TABLE Linie(
name varchar,
PRIMARY KEY (name)
);

例如,使用 pgAdmin 我可以插入 1、2、3、4、5。在运行 5 个等效查询后使用 python,它只有 5 个。

使用 nodeJS 调用测试函数可以正常工作。

当从 python 调用一次函数然后更改插入值然后再次从 python 调用它时,这些值不会被替换而是插入。

此外,它不会抛出任何错误并按应有的方式返回表(替换值除外)。为什么会发生这种情况,我该怎么办?

标签: pythonnode.jspostgresqlpsycopg2

解决方案


默认情况下,Psycopg2 不会提交对数据库所做的更改,除非您connection.commit()在执行 SQL 后显式调用。你可以像这样改变你的代码:

def debug(self):
    try:
        self.connection.execute(
            "SELECT test();")
        res = self.connection.fetchall()
        self.connection.commit()
        print(res)
    except Exception as e:
        print(e)
    return

但是,请小心执行此操作,因为我没有关于self.connection实例的确切信息,因此我假设它是类型connection:) 或者,当您设置与数据库的连接时,将属性设置autocommitTrue如此处所述. 例子:

self.connection = psycopg2.connect(user='foo', password='bar', host='localhost', dbname='mydb')
self.connection.autocommit = True

如果您已经在使用自动提交,请告诉我,我会再看看您的问题。


推荐阅读