【Mac】「python manage.py init_db」で「cannot open DB[1]: com.almworks.sqlite4java.SQLiteException」と出る時の対処方法

プログラミング,python

python manage.py init_dbでエラー発生

「動かして学ぶ!Pythonサーバレスアプリ開発入門」 という書籍を購入しました。

その中でリスト7.5 manage.py のところ、DynamoDB localを動かすためのコードで「python manage.py init_db」というコマンドを実行するのですが、エラーがでて進めなかったので手こずりました。

同じようにエラーが出ている人もきっといると思うので備忘録として残しておきます。

今回のエラーが発生した書籍

動かして学ぶ!Pythonサーバレスアプリ開発入門
Pythonを動かせるようになったけど、自動で実行されてサーバーレスなものは作れないかなぁと思っていたら最適な一冊を見つけました。内容的にPython初心者には少しきついかもしれませんが、書籍の内容は丁寧なので進めやすいとは思います。


スペック

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