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

tkclm6bt  于 2023-10-23  发布在  SQLite
关注(0)|答案(2)|浏览(140)

我想在AWS Lambda上运行的python3.8代码上使用sqlite3上的Window函数。从3.25版本开始提供。
不幸的是,在AWS Lambda Python3.8上,sqlite3库已经过时了:

>>> sqlite3.sqlite_version
'3.7.17'

而在本地,在我的Python 3.8的自制安装:(工作)

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

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

7z5jn7bk

7z5jn7bk1#

我找到了一个方法:我使用外部软件包pysqlite3,在二进制版本中。
在我的requirements.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
jm81lzqq

jm81lzqq2#

由于我使用的是新的arm 64 MacBook Pro,安装pysqlite3-binary的解决方案对我来说不是很可行。我还不得不使用一个只识别Pipfile.lock而不识别Pipfile的受控管道,所以其他解决方案也不适合我。相反,我找到了一种从源代码编译libsqlite3.so.0的方法,并使用它来覆盖AWS Lambda上的默认值。
首先,你需要从源代码编译sqlite amalgamation。我创建了这个Dockerfile,所以我们可以很容易地从arm 64机器上编译Linux/amd 64:

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 build --platform linux/amd64 -t sqlite3-builder -f Dockerfile .命令构建Docker镜像
最后一个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 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包解压缩到的位置。

相关问题