python - 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 调用它时,这些值不会被替换而是插入。
此外,它不会抛出任何错误并按应有的方式返回表(替换值除外)。为什么会发生这种情况,我该怎么办?
解决方案
默认情况下,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
:) 或者,当您设置与数据库的连接时,将属性设置autocommit
为True
,如此处所述. 例子:
self.connection = psycopg2.connect(user='foo', password='bar', host='localhost', dbname='mydb')
self.connection.autocommit = True
如果您已经在使用自动提交,请告诉我,我会再看看您的问题。
推荐阅读
- reactjs - React-Redux:连接期间状态为空
- android-ndk - AMediaCodec_dequeueOutputBuffer 很慢,在一台设备上返回 -10000
- c++ - 如何在 RedHat 7 Linux 上编译用 RedHat 5 编写的 c++98 代码
- python - 如何正确使用 scipy tplquad?
- c# - Hpw 我可以将编码的代码“像 00E6' 还原为 C# 中的字符吗
- python - 如何使用morphologyEx和drawContours检测空的公园空间?
- html - 如何检索表,从中排除一些标签
- mysql - 如何编写用于序列化字段的 UDF
- jupyter-notebook - 如何在 jupyter notebook 中使用已安装的软件包?
- r - apply() 和 forceAndCall() 忽略来自 parent.frame() 的 get()