【问题标题】:How to create a sqlite connection from a db file stored in AWS S3? Python如何从存储在 AWS S3 中的数据库文件创建 sqlite 连接? Python
【发布时间】:2023-02-17 04:15:33
【问题描述】:
在 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 中的文件作为绝对路径而不是对象。
我期待着你的 cmets,他们会帮助我很多
【问题讨论】:
标签:
python
pandas
sqlite
amazon-s3
【解决方案1】:
有几种不同的方法可以解决这个问题。
方法#1
第一种方法是将 sqlite 数据库下载到本地文件系统,然后用 sqlite 打开它。可以在here 找到如何从 S3 下载文件的示例。您可以使用它将文件下载到当前工作目录,然后使用
import sqlite3
con = sqlite3.connect("file.db")
打开文件。
但是,您对此文件所做的任何更改都不会反映在 S3 上的副本中。
方法#2
第二种方法是使用 Litestream。 Litestream 是一种通过将 WAL 写入 S3 来将更改复制回 S3 的工具。 WAL 是文件中更改内容的记录,您可以仅使用 WAL 和 SQLite 数据库的旧副本来恢复数据库的当前状态。每隔一段时间,它会通过写入 SQLite 数据库的新副本来压缩 WAL,然后删除旧数据库和 WAL。
他们有一个 tutorial 解释了如何使用它。
限制
如果你想在 S3 中有一个 SQLite 数据库,并且有多个客户端读写这个数据库怎么办?
这不可能。为此,您需要一个支持多用户并发的数据库,例如 PostgreSQL 或 MySQL。 SQLite 和 S3 无法做到这一点。