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
设置为 True
、as documented here. 示例:
self.connection = psycopg2.connect(user='foo', password='bar', host='localhost', dbname='mydb')
self.connection.autocommit = True
如果您已经在使用自动提交,请告诉我,我会再看看您的问题。
我得到了一些 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
设置为 True
、as documented here. 示例:
self.connection = psycopg2.connect(user='foo', password='bar', host='localhost', dbname='mydb')
self.connection.autocommit = True
如果您已经在使用自动提交,请告诉我,我会再看看您的问题。