prisma generate での ImportError

Posted by rhoboro on 2022-10-22

PrismaとそのPythonクライアントprisma-client-pyが気になっていたので触ってみたところ、prismaコマンド実行で少し躓いたのでメモ。

作業内容自体はQuickstartに沿ったものです。 その中でprisma generateの実行時に下記のエラーに遭遇しました。 このエラー自体はApple siliconのmacOSに固有のエラーだと思います。

$ python3 -m venv venv
$ . venv/bin/activate
(venv) $ pip install prisma
# ここでQuickstartに沿ってschema.prismaを用意する
(venv)$ prisma generate
Prisma schema loaded from schema.prisma
Error: Generator at prisma-client-py could not start:

Traceback (most recent call last):
  File "/Users/rhoboro/go/src/github.com/rhoboro/async-prisma/env/bin/prisma-client-py", line 5, in <module>
    from prisma.cli import main
  File "/Users/rhoboro/go/src/github.com/rhoboro/async-prisma/env/lib/python3.10/site-packages/prisma/__init__.py", line 11, in <module>
    from ._config import config as config
  File "/Users/rhoboro/go/src/github.com/rhoboro/async-prisma/env/lib/python3.10/site-packages/prisma/_config.py", line 8, in <module>
    from pydantic import BaseSettings, Extra, Field
ImportError: dlopen(/Users/rhoboro/go/src/github.com/rhoboro/async-prisma/env/lib/python3.10/site-packages/pydantic/__init__.cpython-310-darwin.so, 0x0002): tried: '/Users/rhoboro/go/src/github.com/rhoboro/async-prisma/env/lib/python3.10/site-packages/pydantic/__init__.cpython-310-darwin.so' (mach-o file, but is an incompatible architecture (have (arm64), need (x86_64)))

Apple siliconはarm64なのでインストールされているバイナリは正しそうですが、なぜかx86_64のバイナリを求められている様子。 PyPI上にあるprisma-client-pyはwheelが提供されているが、これは py3-none-any でアーキテクチャに依存しないもの。

この辺りに不整合がありそうなので、prismaインストール時にローカルでビルドするよう指定したところうまくいきました。

(venv) $ deactivate
$ rm -rf venv
$ python3 -m venv venv
$ . venv/bin/activate
(venv) $ pip install prisma --no-binary :all:
(venv)$ prisma generate
Prisma schema loaded from schema.prisma

✔ Generated Prisma Client Python (v0.7.0) to ./venv/lib/python3.10/site-packages/prisma in 121ms

Prismaは初めて触ってみましたが、型がしっかり聞いていて結構よさそうな印象。 使い込んでみたいですね。

prisma-quickstart

prisma-client-py自体はこの辺りのRustで作られた各種Engine(バイナリ)のWrapperになっていて、prisma generateではjinja2でスキーマファイル(schema.prisma)に対応する.pyファイル作ってるみたいですね。 マイグレーション周りが特定のプログラミング言語に依存しないのは個人的に嬉しいポイント。

prisma-version

tags: Python, Prisma