postgresql - 创建临时文件以上传到 S3
问题描述
我正在编写一个使用 Postgres 表并将表上传到 S3 的 cron 作业。
我打算做以下事情:
将表转换为 csv 并存储在磁盘上。
使用 multipart put 从磁盘获取文件并存储在 s3 中。
从磁盘中删除文件。
问题:
我应该将文件复制到磁盘吗?上传文件后,有什么方法可以临时复制到磁盘而不显式删除文件?
在内存中这样做更有意义吗?Postgres 只复制出对 OutputStream 的写入。AFAIK 无法将输出流上传到 S3。
解决方案
所有这些都可以在内存中完成,假设您的表有足够的内存,或者只读取和上传表的片段。
如果您使用 Python,则 S3 的 MultipartUpload 文档说它允许bytes
每个MultipartUploadPart的文件。这对于其他语言应该是类似的。这样您就可以读取整个表或段,将其转换为类似 csv 的字符串,将它们转换为bytes
然后运行 MultipartUpload。此处不需要磁盘上的文件。
如果您使用 Java,则可以使用 InputStreams 作为上传源。要将您的 OutputStream 转换为 InputStream ,请查看此答案。
AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("accessKey","secretKey"));
s3.putObject(new PutObjectRequest("mybucket", "myfile", inputStream));
但是,如果您只需要备份您的表,那么我建议使用pg_dump
并将生成的文件上传到 S3。
推荐阅读
- dart - Flutter pass User instance to another state and keep it updated
- java - 获取索引位置标签
- php - 如何重建一个sql索引
- spring-boot - 带有 MyBatis 的 Spring Data JDBC 找不到自定义查询
- ios - 无法在 iOS Swift 中使用资产运行动画
- c# - Copy values with same name across classes
- react-native - 要求循环是允许的,但可能导致未初始化的值。考虑重构以消除对循环的需求
- java - Java:比较并替换字符串中的字符
- vb.net - 无法更改 datagridview 内的图像按钮
- php - joomla 在尝试运行我的项目时收到通知