在 S3 存储桶中,我为 SQLite 存储了
file.db
。
我想要的是使用该文件连接到数据库。像这样的东西:
import boto3
import pandas
import sqlite3
s3 = boto3.resource('s3')
cnx = sqliite3.connect('s3://bucket/file.db')
df = pd.read_sql_table('select * from table', cnx)
是否可以使用 python/pandas 从 s3 读取文件?我知道棘手的事情是将文件从 s3 作为绝对路径而不是作为对象获取。
我期待您的评论,它们会对我有很大帮助
有几种不同的方法可以解决这个问题。
第一种方法是将sqlite数据库下载到本地文件系统,然后使用sqlite打开它。您可以在here找到如何从 S3 下载文件的示例。您可以使用它将文件下载到当前工作目录,然后使用
import sqlite3
con = sqlite3.connect("file.db")
打开文件。
但是,您对此文件所做的任何更改都不会反映在 S3 上的副本中。
第二种方法是使用 Litestream。 Litestream 是一种通过将 WAL 写入 S3 将更改复制回 S3 的工具。 WAL 记录了文件中发生的更改,您可以仅使用 WAL 和 SQLite 数据库的旧副本来恢复数据库的当前状态。它经常通过写入 SQLite 数据库的新副本来压缩 WAL,然后删除旧数据库和 WAL。
他们有一个教程解释了如何使用它。
如果您想在 S3 中拥有一个 SQLite 数据库,并且有多个客户端读取和写入该数据库,该怎么办?
这是不可能的。您需要一个支持多用户并发的数据库(例如 PostgreSQL 或 MySQL)来执行此操作。 SQLite 和 S3 无法完成此任务。
您可以使用 rclone 来安装 s3 存储桶。然后它看起来就像是本地文件。
我还没有尝试过这个,但我猜想写入以这种方式安装的 sqlite 数据库要么不起作用,要么性能很差。
读取性能可能也很差,但一般来说,rclone 应该可以解决问题。