psycopg2 插入失败

psycpg2 Insert into fails

我得到了一些 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;

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

table定义如下:

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

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

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

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

它也不会抛出任何错误,并且 returns 和 table 应该是一样的(替换值除外)。 为什么会发生这种情况,我该如何应对?

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

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 :) 或者,当您设置与数据库的连接时,将 属性 autocommit 设置为 Trueas documented here. 示例:

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

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