【问题标题】:PostgreSQL COPY FROM STDIN Expressions从标准输入表达式复制 PostgreSQL
【发布时间】:2012-04-30 07:22:32
【问题描述】:

我正在尝试使用 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 ...”并且失败而不是评估表达式并插入表达式的结果。有谁知道这里可能发生了什么以及我如何可以插入实际的几何图形吗?

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

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

    在批量加载期间更改列 (the ALTER TABLE / SET DATA TYPE / USING) 对我来说不是一个选项,因为它是几何类型的 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 仍会返回错误,说明您的几何数据格式无效。

    【讨论】:

    • 对于任何在家玩的人,这也适用于COPY FROM CSV。这应该在 PostGIS 中有更好的记录。我花了一个下午的时间才找到你的帖子。非常感谢您的贡献。
    • 2017年依然有效。至少我可以避免shapely的慢wkb_hex功能。
    【解决方案2】:

    您可以省略包装文本的函数,导入带有文本列的临时表,然后在该步骤中使用执行转换的函数将 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";
    

    【讨论】:

    • 这基本上就是我最终要做的。我将数据添加到文本列中,创建一个临时几何列,转换数据,然后删除旧列并重命名新列。不是最漂亮的,但它确实有效。
    • 如果您打算在一个表中执行此操作,我认为您可以稍微简化该过程,方法是使用 USING 子句更改列类型进行转换..
    • 不知道 ALTER TABLE / SET DATA TYPE / USING 语法!比添加和删除列更漂亮。
    【解决方案3】:

    您将保留.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;"
    

    这会起作用。

    【讨论】:

      【解决方案4】:

      Point 的值如下所示:0101000020E6100000DA722EC555552B40CDCCCCCCCC0C4840

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

      否则我不知道如何从标准输入复制POINTs。

      【讨论】:

        猜你喜欢
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        • 1970-01-01
        相关资源
        最近更新 更多