PostgreSQL从STDIN表达式复制

时间:2012-04-18 19:49:32

标签: postgresql postgis

我正在尝试使用COPY FROM STDIN将数据导入到我的表中。我表中的一列是几何类型。我的命令看起来像这样......

COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", "Station_Location") FROM stdin;
1       KAVP    WILKES-BARRE    ST_GeomFromText('POINT(41.338055 -75.724166)')
2       KOKV    WINCHESTER      ST_GeomFromText('POINT(39.143333 -78.144444)')
3       KSHD    SHENANDOAH      ST_GeomFromText('POINT(38.263611 -78.896388)')
...

但是,我认为它试图插入文本“ST_GeomFromText('POINT ...”并且失败而不是评估表达式并插入表达式的结果。有谁知道这里可能会发生什么以及我如何可以插入实际的geoms吗?

4 个答案:

答案 0 :(得分:29)

我很难弄清楚如何使用COPY FROM STDIN命令将几何数据批量复制/加载到PostGIS中,我找不到关于此主题的官方文档。

在批量加载(the ALTER TABLE / SET DATA TYPE / USING)期间更改列不是我的选项,因为对于Geometry类型它是only supported in PostGIS 2.0+use of a temporary table也不可接受。

确实有一种直接的方法(至少在PostGIS 1.5.2+中)。 您只需使用简单的WKT(众所周知的文本)表示为您的几何数据重写这种方式的复制语句数据:

1       KAVP    WILKES-BARRE    POINT(41.338055 -75.724166)
2       KOKV    WINCHESTER      POINT(39.143333 -78.144444)
3       KSHD    SHENANDOAH      POINT(38.263611 -78.896388)

如果您已在几何列上强制执行SRID约束,则必须使用以下语法(在此示例中SRID为4326),称为EWKT(扩展的已知文本,即PostGIS specific format ):

1       KAVP    WILKES-BARRE    SRID=4326;POINT(41.338055 -75.724166)
2       KOKV    WINCHESTER      SRID=4326;POINT(39.143333 -78.144444)
3       KSHD    SHENANDOAH      SRID=4326;POINT(38.263611 -78.896388)

结束注释:“POINT”和左括号“(”之间必须没有空格,否则COPY仍会返回错误,说明您的几何数据格式无效。

答案 1 :(得分:2)

您可以省略包装文本的函数,导入带有text列的临时表,然后使用在该步骤中执行转换的函数将INSERT / SELECT运行到永久表中。

INSERT INTO "WeatherStations"
  ("Station_ID", "Station_Code", "Station_Name", "Station_Location")
  SELECT "Station_ID", "Station_Code", "Station_Name",
         ST_GeomFromText("Station_Location")
    FROM "TempWeatherStations";

答案 2 :(得分:-1)

Point的值如下所示:0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

我通常在表格中保留latitudelongitude列,并使用触发器构建空间数据。

我不知道如何从stdin复制POINT

答案 3 :(得分:-1)

您将保留django.core.exceptions.FieldError: Unsupported lookup 'between' for TimeField or join on the field not permitted.文件中的所有值并尝试这样:

.csv

这样可行。