繁体   English   中英

AWS Lambda function 无法从 S3 连接和查询 SQLite 数据库文件

[英]AWS Lambda function can't connect to and query SQLite DB file from S3

我的目标是将 SQLite 数据库文件上传到 AWS S3,使用 AWS Lambda & python ( sqlite3 ) 连接到数据库,查询它,并返回它的一些数据。

将数据库文件上传到 S3 后,我编写了一个 python 脚本(将成为 Lambda 函数)成功地从 S3 下载数据库,使用sqlite3连接到它,并返回一些查询结果。

问题是,当我采用完全相同的代码并将其放入 AWS Lambda 时,出现以下错误:

{
  "errorMessage": "malformed database schema (message_idx_undelivered_one_to_one_imessage) - near \"where\": syntax error",
  "errorType": "DatabaseError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 11, in lambda_handler\n    print(cursor.execute(\"select mycolumn from message limit 1\").fetchone())\n"
  ]
}

这是 python 脚本/Lambda function:

import sqlite3
import boto3

def lambda_handler(event, context):
    s3 = boto3.resource("s3")
    bucket = s3.Bucket("my-bucket")
    bucket.download_file("my_database.db", "/tmp/my_database.db")

    conn = sqlite3.connect("/tmp/my_database.db")
    cursor = conn.cursor()
    print(cursor.execute("select mycolumn from message limit 1").fetchone())

在本地运行此文件可以正常工作。 我已经确认我的本地环境和 Lambda 都在使用以下这些版本:

boto3: 1.20.32
python: 3.9.13
sqlite3: 2.6.0

是我正在尝试读取的数据库的架构。

为什么 Lambda 会产生此错误,而我的本地环境却不会? 请问go如何获取python连接到Lambda function内的数据库?

从 pastebin 提取这里是你的数据库模式中的 DDL,它在打开你的数据库时触发你的错误

CREATE INDEX message_idx_undelivered_one_to_one_imessage
ON message(
    cache_roomnames,
    service,
    is_sent,
    is_delivered,
    was_downgraded,
    item_type
) where cache_roomnames IS NULL
    AND service = 'iMessage'
    AND is_sent = 1
    AND is_delivered = 0
    AND was_downgraded = 0
    AND item_type == 0;

sqlite自3.8.0版本https://www.sqlite.org/partialindex.html开始集成了部分索引功能。 lambda 环境中的 sqlite3 版本可能太旧,无法处理这种模式之王。 lambda 环境中的 sqlite3 依赖项中的版本提升应该可以解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM