我正在使用 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/

    10-15 02:03
    查看更多