我正在使用 pg8000 模块将 python 脚本连接到 postgreSQL 数据库,我想插入一些新行。当我运行脚本时,我没有收到任何错误,它似乎运行良好,但是当我之后检查表时,实际上没有添加任何内容。
令我困惑的是,如果我打印出我使用 pg8000 游标对象执行的查询语句,然后在 pgadmin 界面中复制/粘贴并执行它,它会正确插入一个新行。
另一个奇怪的事情是该表有一个基于 SERIAL 的 ID 字段,每次插入行时都会自动更新。当我运行脚本时,这个序列正在更新。我可以告诉 b/c 要添加的下一个 ID,例如,是 6000。如果我运行脚本(应该添加大约 1000 行但没有),然后手动插入一行,新行的 ID 为 7000。
这是创建和执行语句的循环:
for row in new_signs:
query = "INSERT INTO {0}_signs (source_link, destination_link, exit_number) VALUES ({1},{2},'{3}');".format(city,row[0],row[1],row[2])
print query
cursor.execute(query)
和一些示例输出:
INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (56423,1833854,'26');
INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (353212,310961,'45');
INSERT INTO osm_newyork_signs (source_link, destination_link, exit_number) VALUES (203823,1862344,'63N');
和表定义:
CREATE TABLE public.osm_newyork_signs
(
source_link integer NOT NULL,
destination_link integer NOT NULL,
exit_number text,
"Branch_RouteID" character varying(64),
"Branch_RouteDir" character varying(6),
"Sign_TextType" character varying(6),
"Sign_Text" character varying(255),
"Toward_RouteID" character varying(64),
"Straight_On" character varying(255),
id integer NOT NULL DEFAULT nextval('osm_newyork_signs_id_seq'::regclass),
CONSTRAINT newyork_signs_pkey PRIMARY KEY (id),
CONSTRAINT check_branch_toward CHECK ("Sign_TextType"::text = 'B'::text OR "Sign_TextType"::text = 'T'::text OR "Sign_TextType" IS NULL)
)
WITH (
OIDS=FALSE
);
最佳答案
由于除非您明确调用 conn.commit()
,否则默认情况下自动提交处于关闭状态,因此事务中完成的任何操作都将被撤消。但是,ID 号不会回滚,因此您会看到这种行为。
您有两个选择:
conn.commit()
conn.autocommit = True
您可以在 http://pythonhosted.org/pg8000/quickstart.html#key-points 阅读更多相关信息关于Python/PostgreSQL 插入行无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37709951/