如何将EC2 Linux实例中的数据加载到Postgresql RDS

如何将EC2 Linux实例中的数据加载到Postgresql RDS,postgresql,amazon-web-services,amazon-ec2,Postgresql,Amazon Web Services,Amazon Ec2,我正在运行一个EC2实例(运行Postgresql的AMAZON LINUX X64),需要从EC2获取一个文件并将其加载到运行在RDS上的Postgresql数据库中。我不知道该怎么做,有没有人有这样做的经验?或者有人能给我指一下说明书、白皮书等吗 先谢谢你 迟做总比不做好:-) 我发现,到目前为止,最简单的方法是使用“COPY from”命令从web服务器或基于文件的端点加载数据 实例 假设您拥有以下CSV数据: 1,Fred,Flintstone 2,Barney,Rubble 3,Wi

我正在运行一个EC2实例(运行Postgresql的AMAZON LINUX X64),需要从EC2获取一个文件并将其加载到运行在RDS上的Postgresql数据库中。我不知道该怎么做,有没有人有这样做的经验?或者有人能给我指一下说明书、白皮书等吗

先谢谢你

迟做总比不做好:-)

我发现,到目前为止,最简单的方法是使用“COPY from”命令从web服务器或基于文件的端点加载数据

实例

假设您拥有以下CSV数据:

1,Fred,Flintstone
2,Barney,Rubble
3,Willma,Flintstone
4,Betty,Rubble
列分别为pkid、firstname和姓氏

如果您在web服务器(可能是您在本地运行但可以从外部访问的服务器)上创建此文件,那么您应该能够键入:

http://myserver.blah/flintstones.csv
进入浏览器并查看文件的显示

一旦您能够做到这一点,并且假设您使用的服务器是面向公众的(以便amazons服务器可以看到它),那么您需要启动一个工具,例如PGAdmin或任何其他允许您在postgres安装上运行sql的工具

如何运行这些命令是一个有争议的问题,我在过去使用过各种方法

一个非常有效的方法是在Amazon设备主机上设置ssh登录,然后使用ssh客户端,该客户端允许您通过隧道从本地主机连接到RDS实例,这样做可以使用PGAdmin等程序

如果您不能使用隧道,那么您可以随时编写一个快速的ruby/php/nodejs脚本,它允许您运行所需的两个sql命令

一旦您能够对RDS实例运行SQL命令,您需要做两件事:

  • 1) 创建目标表
  • 2) 使用“复制”命令导入数据
创建目标表很容易,这只是一个简单的CREATETABLE命令

例如:

CREATE TABLE theflintstones
(
  pkid integer primary key,
  firstname text,
  surname text
)
第二个命令有点棘手

如果要从文件系统加载数据,则需要确保将CSV文件复制到RDS有权访问的文件系统位置

然而,根据我过去的经验,我不记得曾经在RDS实例上访问过直接文件系统,因此您很可能不得不使用远程http方法

使用http方法的问题是rds实例可能没有安装wget或curl工具

实际上,我还没有遇到一个至少没有安装wget的系统,因为底层操作系统经常需要wget来从web获取所需的东西。通常也安装了curl

准备好导入数据后,需要使用以下命令:

COPY theflintstones FROM PROGRAM 'curl -s http://myserver/flintstones.csv' WITH(format csv)
其中“myserver”应替换为存储CSV数据文件的web或ip地址,“flintstones.CSV”应替换为要加载的实际文件名

“curl-s[url]”用于在静默模式下运行curl,如果必须使用wget,则应将程序指定为“wget-qO-[url]”

如果一切顺利,postgres应该从远程源加载CSV,然后使用该文件的内容填充表中的列

如果只需要填充表中的某些列,请使用表和列语法:

COPY table(column, column, column ... )

csv将只填充命名为的列,并将其余列设置为默认值。

通常,您要做的是编写一个脚本来读取文件,并与Postgres对话。例如,您可以使用Python。在这种情况下,您可以使用
open
打开一个文件,如果您的文件是csv,还可以使用
csv
模块。然后,您将使用
psycopg
模块与Postgres对话。您正在加载的文件是什么格式的?亚马逊拯救!数据集-该文件是csv文件。是否尝试将其作为表加载?作为表中的字段?