Python/PostgreSQL 插入行无效

标签 python postgresql

我正在使用 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 号不会回滚,因此您会看到这种行为。

你有两个选择:

  1. 执行执行语句后显式提交:
    conn.commit()
  1. 在您的数据库连接上启用自动提交(在您创建游标之前):
    conn.autocommit = True

您可以在 http://pythonhosted.org/pg8000/quickstart.html#key-points 阅读更多相关信息

关于Python/PostgreSQL 插入行无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37709951/

相关文章:

python - 如何使用数字 id 检索 google appengine 实体?

python - YouTube视频时长到Django模型

postgresql - 多表请求中的 pqxx 列名

javascript - Node.js express | JQuery 获取 JSON 时客户端没有任何反应

sql - PostgreSQL 内部加入同一张表 + 第二张表?

Python 在另一个类中使用变量

python - 如何在 Python 中访问时间的子午线?

python - 在 Python 中访问多索引系列中的值

django - 由于 gdal 库,heroku push 被拒绝

php - Symfony 4,Postgres - `Invalid value for parameter "client_encoding": "utf8mb4"` on running doctrine command