微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

aws-sdk / dynamoose是否有可能在DynamoDB Local上导致SQLite语法错误?

如何解决aws-sdk / dynamoose是否有可能在DynamoDB Local上导致SQLite语法错误?

上下文

从Nodejs 6升级到12时发现问题,并带有该项目的依赖项。 使用Dynamoose 2.3 使用docker-compose的容器化应用程序:仅后端和dynamodb实例

用于dynamodb的Docker文件

FROM openjdk:latest

\# Bundle dynamodb
copY . .

EXPOSE 8000
CMD [ "java","-jar","DynamoDBLocal.jar" ]

问题:提起容器时,后端初始化后,dynamodb实例将在下面引发错误,从而导致任何后续查询调用停顿并在后端侧超时时返回。

错误

dynamodb_1  | Sep 03,2020 8:14:36 AM com.almworks.sqlite4java.Internal log
dynamodb_1  | WARNING: [sqlite] sqlitedbaccess$10@b6f156c: job exception
dynamodb_1  | com.almworks.sqlite4java.sqliteException: [1] DB[1] prepare() DROP INDEX Foobar*HVI; [near "*": Syntax error]
dynamodb_1  |   at com.almworks.sqlite4java.sqliteConnection.throwResult(sqliteConnection.java:1436)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteConnection.prepare(sqliteConnection.java:580)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteConnection.prepare(sqliteConnection.java:635)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteConnection.prepare(sqliteConnection.java:622)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.AmazonDynamoDBOfflinesqliteJob.getPreparedStatement(AmazonDynamoDBOfflinesqliteJob.java:138)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.sqlitedbaccess$10.dropGSIsqliteIndex(sqlitedbaccess.java:1221)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.sqlitedbaccess$10.dropIndices(sqlitedbaccess.java:1169)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.sqlitedbaccess$10.doWork(sqlitedbaccess.java:1155)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.sqlitedbaccess$10.doWork(sqlitedbaccess.java:1152)
dynamodb_1  |   at com.amazonaws.services.dynamodbv2.local.shared.access.sqlite.AmazonDynamoDBOfflinesqliteJob.job(AmazonDynamoDBOfflinesqliteJob.java:97)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteJob.execute(sqliteJob.java:372)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteQueue.executeJob(sqliteQueue.java:534)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteQueue.queueFunction(sqliteQueue.java:667)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteQueue.runQueue(sqliteQueue.java:623)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteQueue.access$000(sqliteQueue.java:77)
dynamodb_1  |   at com.almworks.sqlite4java.sqliteQueue$1.run(sqliteQueue.java:205)
dynamodb_1  |   at java.base/java.lang.Thread.run(Thread.java:832)

我怀疑通过Dynamoose的model()创建表时会发生这种情况,该表在后台调用aws的DynamoDB createTable方法

我目前正在分析到nodejs 12和dynamoose 2.3的升级。在本地环境中,我希望运行它来测试项目的其他部分,因此我不介意更新索引和重新创建表,但希望知道此语法错误来自何处以对其进行修复和继续。

问题:aws-sdk或dynamoose是否有可能导致DynamoDB本地实例尝试删除带有sqlite语法错误的索引?

解决方法

问题在于,Dynamoose 0.8.7曾经用于支持架构,这些架构的属性既是hashkey,又具有标记为global的索引。跳转到最新版本时,一些重大更改使它在查询中添加了诸如“ *”之类的字符,从而使SQLite抱怨。

示例:

const FoobarSchema = new dynamoose.Schema({
    foo: {
        type: String,hashkey: true,index: {
             global:true
        }
    }
});

const Foobar = dynamoose.model('Foobar',FoobarSchema,Options); // Blow up

我是该项目和DynamoDb的新手。我不明白将这两个条件放在一起的背后原因是什么,是否应该予以支持。如果有机会,我将对此进行更深入的研究并更新。

,

删除“docker/dynamodb”文件夹中的“shared-local-instance.db”文件为我解决了这个问题(该文件在 docker-compose up 上再次生成并且一切正常)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。