python - 将数据从 postgres 迁移/复制到 vertica

标签 python postgresql copy database-migration vertica

我正在尝试使用 python3 将数据从 postgres 迁移/复制到 vertica(如果还有其他用户友好的方法,我很乐意听到它们)。问题是下面的代码仅在我从 postgres 复制一列数据时才有效。如果我复制多个列,它不会迁移任何内容。即在 vertica 表中创建的是空的。

如何将整个表从 postgres 迁移到 vertica?

conn = psycopg2.connect()

input = io.StringIO()
cur_postrgres = conn.cursor()
cur_postrgres.copy_expert('''COPY (SELECT id, date from table_1) TO STDOUT;''', input)
cur_postrgres.close()

cur_vertica.execute("DROP TABLE IF EXISTS table_1_temp;")
cur_vertica.connection.commit()
cur_vertica.execute('''CREATE TABLE table_1_temp (
id BIGINT, date TIMESTAMP WITHOUT TIME ZONE);''')
cur_vertica.connection.commit()

#cur_vertica.stdin = input
#input.seek(0)

cur_vertica.copy('''COPY table_1_temp FROM STDIN NULL AS 'null' ''',  input.getvalue())
cur_vertica.execute("COMMIT;")
cur_vertica.close()

最佳答案

将 Postgres 数据库复制到 Vertica 的另一种方法是使用 pg_dump。这将创建一个包含制表符分隔文本数据文件的 tar 和一个您可以在 Vertica 中编辑和执行的 SQL 程序。

如果需要创建很多表,这会很有用。 SQL包含每个表的CREATE TABLE、ADD INDEX、CREATE SEQUENCE等语句,并生成COPY语句加载每个数据文件。

Vertica 基于 PostgresQL,因此方言相似。它生成的restore.sql几乎是完美的,你只需要删除不相关的语句,或者更改模式名称,并优化COPY语句。

pg_dump --format=tar --dbname=mydb --username=myuser --no-owner --verbose --no-privileges > mydata.tar

可选择在导出前压缩 tar

zip mydata.tar.zip mydata.tar

将压缩包复制到 Vertica 机器上的工作目录

scp -i ~/.ssh/secret.pem mydata.tar.zip  mydata.tar.zip  myuser@123.456.345:/data

登录实例,解压压缩包:

 ssh -i ~/.ssh/secret.pem myuser@123.456.345:/data
 unzip mydata.tar.zip
 tar -xvf mydata.tar

现在适本地编辑restore.sql 文件。我发现我需要:

  • 删除顶部的一堆与 Vertica 无关的内容,例如 SET statement_timeout = 0;COMMENT ON EXTENSION plpgsql

  • 删除它生成的两个 COPY 语句之一,一个来自 STDIN ,一个来自文件

  • 编辑 COPY 语句以添加特定于 vertica 的内容,例如 DELIMITER AS E'\t' NULL AS '\N' ABORT ON ERROR;

之后,导入只是在 Vertica 中执行该文件:

\i restore_modified.sql

关于python - 将数据从 postgres 迁移/复制到 vertica,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40912992/

相关文章:

Java:创建数组的副本而不使其成为引用

Javascript 将内容复制到剪贴板

python - 捕获组如何工作? (wrt python 正则表达式)

python - 如何使用 scikit-learn 将多项式曲线拟合到数据?

postgresql - Postgres- "ERROR: generation expression is not immutable"为什么我的表达式不是一成不变的?

sql - 从 postgres 的表中选择所有重复项

linux - 在 linux 中复制文件夹而不是 tar 文件

python - docker-compose 不使用 Flask 设置环境变量

python - 与标点符号匹配整个字符串(使用\b 的问题)

python - 如何防止使用相同值创建新 SQLAlchemy 对象的 UUID 主键