Как правильно настроить Django + MS SQL + Docker на Mac? - PullRequest
0 голосов
/ 17 марта 2019

Почему именно эта комбинация?

  • Мне нужно создать веб-сайт, который общается с базой данных MS SQL для отображения инвентаря компании (а БД создается проприетарным программным обеспечением, используемым компанией, поэтому переход на другую базу данных).это не вариант)
  • Я изучал Django & Python в течение последних нескольких месяцев (через официальную документацию, онлайн-курсы, личные проекты), и так как я начинаю понимать вещи, я неЯ думаю, что мне следует внезапно переключиться на .NET или Node.JS, просто потому, что настройка все еще остается загадкой
  • Я работаю над MacBook, так что Docker - единственный способустановить MS SQL Server (насколько я знаю).У меня действительно есть приличный ПК, который мне дал друг (просто нужно его настроить), и если кто-то думает, что это решит все мои проблемы, я пойду дальше и переключусь.

What I 'Вы уже сделали / выяснили (возможно, это было бы полезно для того, кто проходит через тот же процесс):

  • есть множество руководств и руководств, которые объясняют, как использовать Django с Postgre, SQLite и т. д.- все выглядит очень просто, так что все, что мне действительно нужно, это установить
  • Я установил SQL Server и запустил его в контейнере Docker (с помощью https://database.guide/how-to-install-sql-server-on-a-mac/, https://hub.docker.com/_/microsoft-mssql-server, и https://docs.microsoft.com/en-us/sql/linux/quickstart-install-connect-docker?view=sql-server-2017&pivots=cs1-bash)
  • Я успешно восстановил базу данных компании из файла .bak с помощью Azure Data Studio и могу запуститьзапрашивает его из командной строки, через Kitematic и, конечно же, сам ADS.
  • Я попытался подключиться к базе данных из нового проекта Django (используя PyCharm, хотя это, вероятно, не имеет значения),используя настройки, изложенные здесь: https://github.com/michiya/django-pyodbc-azure Я получаю сообщение об ошибке «изображение не найдено», и вот полный вывод в консоли (на случай, если кто-то заметит что-то полезное):

Unhandled exception in thread started by <function check_errors.<locals>.wrapper at 0x105ff5158>
Traceback (most recent call last):
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/sql_server/pyodbc/base.py", line 15, in <module>
    import pyodbc as Database
ImportError: dlopen(/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/pyodbc.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/unixodbc/lib/libodbc.2.dylib
  Referenced from: /Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/pyodbc.cpython-37m-darwin.so
  Reason: image not found

During handling of the above exception, another exception occurred:

*Traceback (most recent call last):
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/utils/autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/core/management/commands/runserver.py", line 109, in inner_run
    autoreload.raise_last_exception()
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/utils/autoreload.py", line 248, in raise_last_exception
    raise _exception[1]
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/core/management/__init__.py", line 337, in execute
    autoreload.check_errors(django.setup)()
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/utils/autoreload.py", line 225, in wrapper
    fn(*args, **kwargs)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/apps/registry.py", line 112, in populate
    app_config.import_models()
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/apps/config.py", line 198, in import_models
    self.models_module = import_module(models_module_name)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 728, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/contrib/auth/models.py", line 2, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/contrib/auth/base_user.py", line 47, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/models/base.py", line 101, in __new__
    new_class.add_to_class('_meta', Options(meta, app_label))
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/models/base.py", line 305, in add_to_class
    value.contribute_to_class(cls, name)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/models/options.py", line 203, in contribute_to_class
    self.db_table = truncate_name(self.db_table, connection.ops.max_name_length())
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/__init__.py", line 33, in __getattr__
    return getattr(connections[DEFAULT_DB_ALIAS], item)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/utils.py", line 202, in __getitem__
    backend = load_backend(db['ENGINE'])
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/django/db/utils.py", line 110, in load_backend
    return import_module('%s.base' % backend_name)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/sql_server/pyodbc/base.py", line 17, in <module>
    raise ImproperlyConfigured("Error loading pyodbc module: %s" % e)
django.core.exceptions.ImproperlyConfigured: Error loading pyodbc module: dlopen(/Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/pyodbc.cpython-37m-darwin.so, 2): Library not loaded: /usr/local/opt/unixodbc/lib/libodbc.2.dylib
  Referenced from: /Users/student8/Desktop/GEMROVER/django_site/lib/python3.7/site-packages/pyodbc.cpython-37m-darwin.so
  Reason: image not found*

IЯ уже несколько дней гуглю эти ошибки и читаю / смотрю различные руководства, но безрезультатно ... Кажется, что жалуется, что pyodbc не установлен, но я дважды проверил, и у меня естьЭто.То же самое для django-pyodbc-azure.

На всякий случай, вот что у меня есть в моем файле settings.py :


    DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': '*********',
        'USER': 'sa',
        'PASSWORD': '********',
        'HOST': '192.168.1.97',
        'PORT': '1433',

        'OPTIONS': {
            'driver': 'ODBC Driver 13 for SQL Server',
        },
    },
}

Эта конкретная комбинация имени пользователя и пароля (***), IP-адрес хоста и порт прекрасно работают в Azure Data Studio.

  • Я установил Django в другой контейнер Docker, следуя этому руководству: https://docs.docker.com/compose/django/ К сожалению, это показывает, как установить с Postgres, и не ясно, как изменить требования .txt файл, чтобы заставить это работать с сервером SQL (что я помещаю туда вместо psycopg2> = 2.7, <3.0, чтобы он работал с MS SQL?) </em>.Я полагаю, что-то вроде этого будет идти в docker-compose.yml :

db:
    image: "mcr.microsoft.com/mssql/server"
    environment:
        SA_PASSWORD: "Your_password123"
        ACCEPT_EULA: "Y"

(заимствовано из https://docs.docker.com/compose/aspnet-mssql-compose/)

И Dockerfile , вероятно, останется таким же, как показано здесь: https://docs.docker.com/compose/django/?

Мне также не совсем ясно, должны ли Django и SQL Server быть в одном и том же образе Docker,или два отдельных? Полагаю, одно и то же, поскольку именно так их учебник обрабатывает Django + Postgres? Кроме того, в будущем, когда придет время развертывать сайт, все это будет работать гладко, скажем, с Apache, или, если, возможно,Я иду с Azure?

Любая помощь будет принята с благодарностью! Если все это покажется вам чрезвычайно сложной ситуацией: да, я довольно новичок в веб-разработке ... Я старался изо всех сил читатьчерез все, что я мог найти здесь, в стеке и в других местах, но пока не смог найти решение.

ОБНОВЛЕНИЕ 1:

Ого, я сделалнемного прогресса! Обычно задаю вопросна помогает.Сначала я сделал

brew install unixodbc

Рекомендовано здесь: https://github.com/mkleehammer/pyodbc/issues/87 Это исправило ошибку, которую я получал ранее.Затем я получил еще одну ошибку:

Can't open lib 'ODBC Driver 13 for SQL Server'

Но исправили следующие:

brew tap microsoft/mssql-release https://github.com/Microsoft/homebrew-mssql-release
brew update
brew install msodbcsql mssql-tools

(из ответа Рене на этот вопрос Не удается открыть lib 'ODBC Driver 13 for SQL Server'? Проблема с компоновкой Sym? , минус бит о --no-sandbox - thisдал больше ошибок, поэтому я удалил его)

Сайт Django по умолчанию загружен (через python manage.py runserver), поэтому я, наконец, готов начать работу с базой данных SQL!Я доложу, как только убедился, что все идет гладко.Буду признателен за любые комментарии по поводу моих предыдущих вопросов (например, должен ли я иметь Django в контейнере докера, и если да, то должен ли он использовать контейнер совместно с SQL Server или находиться в отдельном?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...