【Mac】「python manage.py init_db」で「cannot open DB[1]: com.almworks.sqlite4java.SQLiteException」と出る時の対処方法
python manage.py init_dbでエラー発生
「動かして学ぶ!Pythonサーバレスアプリ開発入門」 という書籍を購入しました。
その中でリスト7.5 manage.py のところ、DynamoDB localを動かすためのコードで「python manage.py init_db」というコマンドを実行するのですが、エラーがでて進めなかったので手こずりました。
同じようにエラーが出ている人もきっといると思うので備忘録として残しておきます。
今回のエラーが発生した書籍
スペック
MacBook Air (M1, 2020)
アーキテクチャ:arm64
自身のアーキテクチャを確認するコマンドは以下。
$ uname -m
arm64
参考:Macに搭載されているCPUのアーキテクチャを確認する方法
ただ、今回のエラーはこれが原因だったのですが・・・。
結論:JDKはx64をインストールしなければならない
自身のmacのアーキテクチャが「arm64」だったため、JDKのインストーラーは「Arm64 DMG Installer」を選びました。
インストール先:https://www.oracle.com/java/technologies/downloads/#jdk17-mac
しかし結論から述べるとここは「x64 DMG Installer」を選んでください。
そうしないとmanage.pyを動かすときにエラーが出ました。
エラー文
警告: [sqlite] cannot open DB[1]: com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: /Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: dlopen(/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib, 1): no suitable image found. Did find:
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
11月 28, 2021 9:15:51 午後 com.almworks.sqlite4java.Internal log
重大: [sqlite] SQLiteQueue[shared-local-instance.db]: error running job queue
com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: /Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: dlopen(/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib, 1): no suitable image found. Did find:
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97)
at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441)
at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)
at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293)
at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464)
at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641)
at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623)
at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77)
at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.UnsatisfiedLinkError: /Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: dlopen(/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib, 1): no suitable image found. Did find:
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
/Users/takahashiseijika/serverless_test/dynamodb_local_latest/DynamoDBLocal_lib/libsqlite4java-osx.dylib: no matching architecture in universal wrapper
at java.base/jdk.internal.loader.NativeLibraries.load(Native Method)
at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228)
at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170)
at java.base/java.lang.ClassLoader.loadLibrary(ClassLoader.java:2389)
at java.base/java.lang.Runtime.load0(Runtime.java:755)
at java.base/java.lang.System.load(System.java:1953)
at com.almworks.sqlite4java.Internal.tryLoadFromPath(Internal.java:340)
at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:117)
at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:95)
... 9 more
JDKを再インストールする
一度「arm64」のJDKを入れてしまっているので、x64のJDKを入れる前にアンインストールします。
アンインストールはディレクトリを消すだけで完了するのでrmコマンドを実行だけでOKです。
まずJDKがインストールされているディレクトリがどこかを確認します。
確認するコマンドは以下。
$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
17.0.1 (arm64) "Oracle Corporation" - "Java SE 17.0.1" /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
ディレクトリが確認できたら以下のコマンドを実行しましょう。
-rfオプションの後には、自身の環境のJDKのインストール先のディレクトリを指定してください。
$ rm -rf /Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk
$ /usr/libexec/java_home -V
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
これでアンインストールは完了です。
あとはオラクルのページを開きx64のインストーラーで改めてJDKを入れます。
そうすると書籍の「python manage.py init_db」が実行できました。
参考文献
Pythonは日本語の文献も増えていますが個別のエラーに対する対応方法については英語のサイトの方がヒントが落ちていますね。
今回のエラーも英語圏のサイトがヒントになりました。
https://stackoverflow.com/questions/66635424/dynamodb-local-setup-on-m1-apple-silicon-mac