Приучаю себя к хорошему, заставляю себя перейти с Windows на macOS. Под окошками схема отработана, там надо всего-навсего поставить специально скомпилированный коннектор к БД (например,
отсюда) и все работает. Но под macOS, хоть и прилетают коннекторы через PIP, выдаётся ошибка:
django.db.utils.OperationalError: (2002, "Can't connect to server on '192.168.1.ххх' (60)")
...
Схема такая:
Docker Compose
Есть вот такой
docker-compose.yml:
version: "3.0"
services:
mariadb:
container_name: MariaDB
image: mariadb:10.7.6
volumes:
- "/Users/xxx/VM/docker-data/mariadb/data:/var/lib/mysql"
environment:
- "MYSQL_ROOT_PASSWORD=*****"
- "MYSQL_ROOT_HOST=192.168.1.xxx"
ports:
- "3307:3306"
command:
--bind-address="0.0.0.0"
--skip_ssl="true"
--character-set-server="utf8"
--collation-server="utf8_unicode_ci"
В docker через CLI создан внешний суперпользователь, база, пользователь базы, выданы права этому пользователю. Контейнер запущен. Через DataGrip к этой базе отлично коннектится, таблицы видны и все ок. С других машин в домашней сетки тоже коннектится (ведь база "светит" на внешний адрес по порту 3307).
Установка коннектора на macOS
Само собой по PIP просто так коннектор не поставится. Нужно чтобы в системе был клиент БД. Не знаю, правильно ли делаю, но нагуглилось такое:
# устанавливаю коннектор
brew install mariadb-connector-c
# симлинк конфиг-файла, в каталог, где его будет искать python-коннектор
sudo ln -s /usr/local/opt/mariadb-connector-c/bin/mariadb_config /usr/local/bin/mysql_config
# активируем виртуальное окружение, ставим коннектор
source ~/path-to-project-enveroment/bin/activate
pip install mysqlclient
# выключаем окружение, удаляем симлинк и отключаем системный коннектор (можно этого и не делать)
deactivate
sudo rm /usr/local/bin/mysql_config
brew unlink mariadb-connector-c
Python-коннектор базы данных стоит и даже притащил зависимость:
mysql-connector-python==8.0.31
mysqlclient==2.1.1
Под окошками, когда коннектор стоит, уже все работает. Но не под macOS. Само собой проверил-перепроверил настройки БД в Django (собственно по ошибке видно, что пытается коннектится по верному IP БД):
import socket
from prj.my_secret import MY_DATABASE_HOST_DEV1, MY_DATABASE_HOST_DEV2, MY_DATABASE_PORT_DEV, MY_DATABASE_NAME_DEV, MY_DATABASE_USER_DEV, MY_DATABASE_PASSWORD_DEV, MY_HOST_HOME1
DATABASES = {
'default': {
'ENGINE': "django.db.backends.mysql",
'HOST': MY_DATABASE_HOST_DEV1 if socket.gethostname() == MY_HOST_HOME1 else MY_DATABASE_HOST_DEV2,
'PORT': MY_DATABASE_PORT_DEV,
'NAME': MY_DATABASE_NAME_DEV,
'USER': MY_DATABASE_USER_DEV,
'PASSWORD': MY_DATABASE_PASSWORD_DEV,
# 'OPTIONS': { 'autocommit': True, }
}
}
Что делать? Почему?? Что за грабли с macOS?
P.S. macOS Monterey 12.6, процессор M1 (
UPD: macOS Ventura 13.0,).