Trong bài viết này, mình sẽ nhanh chóng hướng dẫn bạn cách xử lý lỗi không tương thích của mysqlclient trên máy Mac sử dụng chip M1 hoặc M2. Bạn có thể gặp lỗi như `Symbol not found: _mysql_affected_rows` khi chạy python app của mình trên M1/M2 chip.
Về cơ bản, các bước sẽ như sau:
- Cài Rosetta 2
- Cài
brewhỗ trợ x86_64 (không phải brew cho M1/M2 hay ảm chip) vào/usr/local/ - Dùng
brewvừa cài ở trên để cài mysql 5 hoặc 8 (tuỳ phiên bản bạn đang sử dụng). - Cài
mysqlclient
Cài Rosetta 2
Mở Terminal mới (nhớ Exit terminal trước đó nếu có). Chạy lệnh sau để cài
softwareupdate --install-rosetta
- Sau đó, exit Terminal
- Dùng Finder để vào thư mục Applications => Utilities
- Nhấp chuột phải vào app Terminal và chọn Get Info.
- Ở box Info, check “Open using Rosetta”
- Chạy app Terminal
Cài Brew vào /usr/local
Tại Terminal vừa mở, chạy lênh sau để cài brew vào thư mục /usr/local:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Sau khi cài đặt thành công, bạn nhớ update path của mình (thêm trực tiếp vào file ~/.zshrc:
echo ‘export PATH=”/usr/local/bin:$PATH”‘ >> ~/.zshrc
source ~/.zshrc
Cài đặt MySQL 8
Chạy lệnh sau để cài MySQL 8:
arch -x86_64 /usr/local/Homebrew/bin/brew install mysql-client@8.0
Update ~/.zshrc một lần nữa để thêm các path sau:
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/opt/openssl@3/lib/
export PATH="/usr/local/opt/mysql-client@8.0/bin:$PATH"
alias python86='CPPFLAGS="-I/usr/local/opt/openssl@3/include" LDFLAGS="-L/usr/local/opt/openssl@3/lib" MYSQLCLIENT_CFLAGS="-I/usr/local/opt/mysql-client@8.0/include/mysql" MYSQLCLIENT_LDFLAGS="-L/usr/local/opt/mysql-client@8.0/lib -lmysqlclient" arch -x86_64'
Chú ý, trong config trên, chúng ta cũng tạo thêm lệnh python86 để sử dụng python ở môi trường mô phỏng x86_64. Như thế, chúng ta sẽ không bị vướng các lỗi không tương tích với M1/M2.
Cài đặt mýsqlclient cho python app của bạn
Kích hoạt môi trường virtual environment cho app của bạn. Ví dụ, trên app của mình, sau khi đã tạo virtual environment venv, mình chạy lệnh sau:
. venv/bin/activate
Chạy lệnh sau để cài mysqlclient:
python86 python3 -m pip install --no-cache-dir --force-reinstall mysqlclient
python86là câu lệnh chúng ta khai báo trong.zshrcở trên.python3là bản python mà bạn đang sử dụng (vd 3, 3.8, 3.9). Trên máy mình python3 được trỏ tới python3.9
Vậy là bạn đã hoàn tất việc setup, bây giờ app sẽ không còn báo lỗi kết nối với CSDL nữa 🙂
