首页 文章

PostgreSQL从STDIN表达式复制

提问于
浏览
15

我试图使用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 回答

  • 28

    我很难弄清楚如何使用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中) . 您只需使用Geometry数据的简单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

    您可以省略包装文本的函数,导入带有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

    Point的值看起来像这样: 0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840 .

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

    我不知道如何从stdin复制 POINT s .

  • -1

    您将保留 .csv 文件中的所有值并尝试这样:

    CAT /path/file/demo.csv | psql -u <username> -h <localhost> -d<database> 
    -c "COPY "WeatherStations" ("Station_ID", "Station_Code", "Station_Name", 
    "Station_Location") FROM stdin;"
    

    这会奏效 .

相关问题