在Lambda Python3.9上升级SQLite版本

wr98u20j  于 2023-06-23  发布在  SQLite
关注(0)|答案(1)|浏览(205)

AWS Lambda运行时Python 3.9上的SQLite内置版本是v3.7.17,于2013年发布。我无法用Layer或Code Deployment升级这个版本,因为库源代码被安排在一个不可覆盖的地方,因为Python 3.9与SQLite捆绑在一起(包括电池和所有)。Lambda在/var/runtime/lib中找到sqlite.so
有没有方法在Lambda中更新SQLite?
Python dumb of Lambda env vars:

'LAMBDA_RUNTIME_DIR': '/var/runtime',
'LAMBDA_TASK_ROOT': '/var/task',
'LANG': 'en_US.UTF-8',
'LD_LIBRARY_PATH': '/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib',
'PATH': '/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin',
'PWD': '/var/task',
'PYTHONPATH': '/var/runtime',
'SHLVL': '0',
'TZ': ':UTC',

系统路径

[
'/var/task',
'/opt/python/lib/python3.8/site-packages',
'/opt/python',
'/var/runtime',
'/var/lang/lib/python38.zip',
'/var/lang/lib/python3.8',
'/var/lang/lib/python3.8/lib-dynload',
'/var/lang/lib/python3.8/site-packages',
'/opt/python/lib/python3.8/site-packages',
'/opt/python'
]

证明:

import sqlite3
print("sqlite3:")
sqlite3_version = ".".join(str(x) for x in sqlite3.version_info)
sqlite3_lib_version = ".".join(str(x) for x in sqlite3.sqlite_version_info)
print(f"Version: v{sqlite3_version}")
print(f"SQLite Library Version: v{sqlite3_lib_version}")
sqlite3:
Version: v2.6.0
SQLite Library Version: v3.7.17
cvxl0en2

cvxl0en21#

在使用Lambda时,我使用pysqlite3-binary获得了sqlite3的最新版本。如果您在Linux上开发和部署,这可能真的很容易。然后你可以在任何地方安装这个包。但是,如果您在Linux上部署Lambda时只需要该包,那么您就必须处理该包在其他平台上不可用的事实。
如果你正在使用Pipenv和Docker,下面是如何做到的:

  • 管道文件 *
[packages]
requests = "*"
boto3 = "*"

[sqlite]
pysqlite3-binary = { version = "*", platform_machine = "== 'x86_64'" }

要在本地创建锁文件,您需要使用与您通常使用的相同的命令:

$ pipenv update

在代码中,如果模块可用,请使用它,否则回退到系统版本:

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

print(f"{sqlite3.sqlite_version=}")

然后在你的Dockerfile中:

RUN pip install pipenv

COPY Pipfile Pipfile.lock ./

# Lock the sqlite category to fetch hashes for the Linux platform
RUN PIPENV_VENV_IN_PROJECT=1 pipenv lock --categories sqlite
# Install everything from the packages and sqlite categories, and
# rely on package hashes in the Pipfile.lock
RUN PIPENV_VENV_IN_PROJECT=1 pipenv install --deploy --categories="packages sqlite" --verbose

请注意,截至2022年10月,--categories标志在pipenv中是新的,所以请确保您获得的是pipenv的最新版本。Github issue,文档

相关问题