在 AWS Lambda 上安装较新版本的 sqlite3

问题描述 投票:0回答:2

我想在 AWS Lambda 上运行的 python3.8 代码上使用 sqlite3 上的窗口函数。 它们从

3.25
版本开始可用。

不幸的是,在AWS Lambda Python3.8上,sqlite3库已经过时了:

>>> sqlite3.sqlite_version
'3.7.17'

在本地,在我的 Python3.8 自制安装上:(工作)

>>> import sqlite3
>>> sqlite3.sqlite_version
'3.31.1'

如何在 AWS Lambda Python 3.8 上获得 sqlite3 版本 > 3.25 ?

python sqlite aws-lambda
2个回答
5
投票

我找到了一个方法:我使用了外部包

pysqlite3
,二进制版本。

在我的要求.txt中

pysqlite3-binary==0.4.4

在代码中

try:
    import pysqlite3 as sqlite3
except ModuleNotFoundError:
    import sqlite3  # for local testing because pysqlite3-binary couldn't be installed on macos

0
投票

由于我使用的是新的arm64 MacBook Pro,安装

pysqlite3-binary
的解决方案对我来说不太可行。相反,我找到了一种从源代码编译
libsqlite3.so.0
并使用它覆盖 AWS Lambda 上的默认值的方法。

首先你要从源代码编译sqlite合并。我创建了这个

Dockerfile

FROM amazonlinux:2
RUN yum install -y tar gzip gcc make
ARG SQLITE_VERSION=3430200
RUN curl -sSLO https://www.sqlite.org/2023/sqlite-autoconf-${SQLITE_VERSION}.tar.gz
RUN tar xf sqlite-autoconf-${SQLITE_VERSION}.tar.gz; \
    mv /sqlite-autoconf-${SQLITE_VERSION} /sqlite-autoconf; \
    cd /sqlite-autoconf; \
    ./configure; \
    make

现在我们可以使用命令构建 Docker 镜像了

docker build --platform linux/amd64 -t sqlite3-builder -f Dockerfile .

最后一个

make
命令会将
libsqlite3.so.0
放在目录
/sqlite-autoconf/.libs
下。然后我们可以使用
docker cp
来提取它:

id=$(docker create sqlite3-builder)
docker cp $id:/sqlite-autoconf/.libs/libsqlite3.so.0.8.6 local/lib/libsqlite3.so.0
docker rm -v $id

现在我们可以将此

libsqlite3.so.0
文件与其他代码一起上传到 AWS Lambda。

最后一步是在 AWS Lambda 中设置一个覆盖系统 SQLite3 的环境变量。例如,

LD_PRELOAD=/var/task/lib/libsqlite3.so.0
。请注意,
/var/task
是您的 ZIP 包解压到的位置。

© www.soinside.com 2019 - 2024. All rights reserved.