运行 脚本后,列名未出现在 pgadmin 中

After running script, column names not appearing in pgadmin

有时,当我 运行 我的 Python 脚本调用 shp2pgsql 上传一个新的 table 到数据库时,当我在pgadmin,它显示为空白列名称:

这个有列名 通常当我再次 运行 脚本时它会修复问题,并且 pgadmin 会显示一条关于数据库清理的消息。老实说,问题出在我的老板身上,因为他认为这是我的代码有问题的标志,在他看到 pgadmin 中的名字之前我们无法继续前进(偶然当我演示脚本时是 1/10 时间没有列名就搞砸了。

在 postgres 中甚至可以有一个没有列名的 table 吗?

这是真空消息

这是 psql\d 的输出(假设 XYZ 是项目名称和数据库名称)

xyz => \d asmithe.intersect
                                     Table "asmithe.intersect"
   Column   |             Type             |                         Modifiers

------------+------------------------------+------------------------------------
------------------------
 gid        | integer                      | not null default nextval('intersect
ion_gid_seq'::regclass)
 fid_xyz_09 | integer                      |
 juris_id   | character varying(2)         |
 xyz_plot   | numeric                      |
 poly_id    | character varying(20)        |
 layer      | character varying(2)         |
 area       | numeric                      |
 perimeter  | numeric                      |
 lid_dist   | integer                      |
 comm       | character varying(252)       |
 cdate      | character varying(30)        |
 sdate      | character varying(30)        |
 edate      | character varying(30)        |
 afsdate    | character varying(30)        |
 afedate    | character varying(30)        |
 capdate    | character varying(30)        |
 salvage    | double precision             |
 pb_harv    | double precision             |
 utotarea   | numeric                      |
 nbacvers   | character varying(24)        |
 totarea    | numeric                      |
 areamoda   | numeric                      |
 areamodb   | numeric                      |
 areamodt   | double precision             |
 areamodv   | numeric                      |
 area_intr  | numeric                      |
 dist_perct | numeric                      |
 id         | double precision             |
 floodid    | double precision             |
 basr       | double precision             |
 floodmaps  | double precision             |
 floodmapm  | double precision             |
 floodcaus  | double precision             |
 burnclas   | double precision             |
 geom       | geometry(MultiPolygon,13862) |
Indexes:
    "intersect_pkey" PRIMARY KEY, btree (gid)

退出并重新启动通常可以解决问题。

In postgres is it even possible to have a table without column names?

可以创建具有零列的 table:

test=> CREATE TABLE zerocolumns();
CREATE TABLE
test=> \d zerocolumns 
Table "public.zerocolumns"
 Column | Type | Modifiers 
--------+------+-----------

但不是零宽度列名:

test=> CREATE TABLE zerowidthcol("" integer);
ERROR:  zero-length delimited identifier at or near """"
LINE 1: CREATE TABLE zerowidthcol("" integer);

                                  ^

尽管列名仅由 space 组成是允许的:

test=> CREATE TABLE spacecol(" " integer);
CREATE TABLE
test=> \d spacecol 
   Table "public.spacecol"
 Column |  Type   | Modifiers 
--------+---------+-----------
        | integer | 

如果发生这种情况,请显示 psql\d 命令的输出。只有(经过大量编辑的)屏幕截图,我无法告诉您更有用的东西。

如果非要我猜的话,我会说这可能是 PgAdmin 中的绘图错误。


更新:table 大改动后 VACUUM 消息正常。阅读消息,它解释了发生了什么。那里没有问题。

psql 输出没有任何问题,并且由于退出并重新启动 PgAdmin 修复了它,我相信您遇到了与绘图或目录访问相关的 PgAdmin 错误。如果它发生在当前的 PgAdmin 版本上,并且您可以使用可以与 public 共享的脚本重现它,请 post 在 pgadmin-support 邮件列表上报告。

在 pgAdmin 1.18.1 中,当 运行 DDL(即 SQL 删除并重新创建所有 table 的脚本时,我也遇到了同样的情况。重新启动 pgAdmin 或刷新数据库后,它再次工作(仅刷新 table 是不够的)。似乎 pgAdmin 在 table 被替换后根本不会自动刷新 table 元数据。