我想在 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 ?
我找到了一个方法:我使用了外部包
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
由于我使用的是新的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 包解压到的位置。