Ошибка Django 2.1 SQL Server 17 — недоступна серверная часть базы данных. Попробуйте использовать 'django.db.backends.XXX'

django.core.exceptions.ImproperlyConfigured: 'django-pyodbc-azure' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
    'mysql', 'oracle', 'postgresql', 'sqlite3'

Я попытался переключиться на следующие настройки БАЗЫ ДАННЫХ, но безуспешно.

DATABASES = {
    'default': {
        'ENGINE': 'django-pyodbc-azure',  #None of these work either: 'django_pyodbc' 'sqlserver_ado', 'sql_server.pyodbc', 'django-pyodbc-azure','pyodbc'
        'HOST': 'test-server-local',
        'NAME': 'db-name',
        'USER': 'sql_username',
        'PASSWORD': 'password',
        'PORT': '1433'
            # 'OPTIONS': {
            # 'driver': 'ODBC Driver 17 for SQL Server'
            # 'driver': 'SQL Server Native Client 11.0',
            # 'provider': 'SQLOLEDB' # Have also tried 'SQLCLI11' and 'SQLOLEDB'
            # 'extra_params': 'DataTypeCompatibility=80'
        # }
    }
}

Мне удалось попасть в базу данных SQLLite и запустить импорт pyodbc (напрямую через Python), но я не могу использовать это в Django.

Я уже упоминал следующие вопросы о переполнении стека (безуспешно). Решение 1 Решение 2 и версии Django/SQL Server, которые у них есть, намного старше, чем то, что я настроил. Я бы не хотел переходить с Django v2.1 на более низкую версию, просто для поддержки базы данных SQL Server, не проверяя, есть ли другие варианты.

Я проверил и добавил следующие пакеты сайта в переменные пути к среде/системе:

    C:\Users\\AppData\Local\Programs\Python\Python37-32\Lib\site-packages
    - django_pyodbc
    - django_pyodbc-2.0.0a1.dist-info
    - django_mssql-1.8.dist-info
    - django_pyodbc_azure-2.1.0.0.dist-info

Выполнение следующего кода действительно попадает в базу данных и возвращает данные, поэтому я знаю, что это не просто Python, но, возможно, Django.

import pyodbc 
server = 'test-server-local' 
database = 'TEST-DB'
username = 'sql_username'
password = 'password'
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()

cursor.execute("SELECT DepartmentName, DepartmentID from dbo.Departments;") 
row = cursor.fetchone() 
while row: 
    print(row.DepartmentID, row.DepartmentName)
    row = cursor.fetchone()

person Loser Coder    schedule 23.08.2018    source источник


Ответы (2)


Вот полная установка, которая проверена как работающая, если django-pyodbc-azure установлен в вашей текущей виртуальной среде:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'HOST': 'dbserver.your-domain.com',
        'PORT': '1433',
        'NAME': 'project',
        'USER': 'project_user',
        'PASSWORD': 'project_password',
        'OPTIONS': {
            'driver': 'ODBC Driver 17 for SQL Server',
            'unicode_results': True,
        },
    },
}

Полные инструкции находятся здесь: https://pyphilly.org/django-and-sql-server-2018-edition/

person FlipperPA    schedule 24.08.2018
comment
Я получаю ту же ошибку, даже когда я использую этот параметр. django.core.exceptions.ImproperlyConfigured: «sql_server.pyodbc» не является доступной базой данных. Попробуйте использовать «django.db.backends.XXX», где XXX — одно из: «mysql», «oracle», «postgresql», «sqlite3». - person Loser Coder; 24.08.2018
comment
Я попытался добавить в «INSTALLED_APPS» «django-pyodbc-azure», но теперь появилась другая ошибка — ModuleNotFoundError: нет модуля с именем «django-pyodbc-azure». - person Loser Coder; 24.08.2018
comment
ОБНОВЛЕНИЕ: я добавил в «INSTALLED_APPS»: «sql_server» и «pyodbc» и перешел к следующим шагам/ошибке: похоже, что сейчас он пытается попасть в базу данных. Пользователь настроен как пользователь с правами администратора/полного доступа к этой базе данных, поэтому я не уверен, чего не хватает... django.db.utils.InterfaceError: ('28000', '[28000] [Microsoft][ODBC Driver 17 для SQL Server][SQL Server]Ошибка входа в систему для пользователя \'project_user\'. (18456); Не удается открыть базу данных db-test, запрошенную при входе в систему. Ошибка входа в систему. (4060); [28000] [Microsoft] [Драйвер ODBC 17 для SQL Server]Недопустимый атрибут строки подключения (0)') - person Loser Coder; 24.08.2018
comment
Вы используете virtualenv? Похоже, он не находит его в вашем PYTHON_PATH. Вам не нужно добавлять их в INSTALLED_APPS, если вы правильно настроили virtualenv. Ошибка, которую вы получаете сейчас, связана с тем, что вы используете неправильные учетные данные (приведенные в примере)... но я все равно проверил бы ваш путь и virtualenv. Хороший прогресс! - person FlipperPA; 24.08.2018
comment
Я заставил это работать. Есть ли способ запустить некоторые хранимые процедуры sql вместо использования отображения модели ORM? Можно ли это делать или не рекомендуется? - person Loser Coder; 28.08.2018
comment
@LoserCoder Это не рекомендуется, но это более сложный вопрос. Я использую Django с базой данных PostgreSQL для основного сайта Django, но также извлекаю данные в представления из хранимых процедур в SQL Server. Что-то вроде from django.db import connections; cursor = connections['mssqldb'].cursor(); res = cursor.execute('EXEC get_user_data @username=%s, user_type=%s', (username, 'staff')), затем перебрать res для результатов сохраненного процесса, строка за строкой. Для моего основного сайта Django я придерживаюсь моделей и ORM; это стоит изучить и сэкономит вам много боли! - person FlipperPA; 29.08.2018
comment
Я открыт для любого подхода, если его легко поддерживать :) («SQL содержит 0 маркеров параметров, но был предоставлен 1 параметр», «HY000») Я получаю это исключение — я получал еще одну ошибку непосредственно перед тем, как исправил это: TypeError: не все аргументы преобразуются во время форматирования строки - person Loser Coder; 29.08.2018
comment
В таком случае я определенно рекомендую изучить ORM! Вы уверены, что используете cursor из django.db.connections, а не pyodbc? pyodbc использует ? в качестве заполнителя, тогда как Django использует %s. - person FlipperPA; 29.08.2018

У меня была та же проблема, что и у ОП, точно. Я использую PyCharm. Наконец я пришел к выводу, что моя виртуальная среда не работает должным образом. Я не мог понять, в чем проблема... из консоли python я мог импортировать sql_server, поэтому он был на пути, но мои тесты в pycharm не сошлись, выдавая ту же ошибку, что и выше.

Итак, я создал новую виртуальную среду, на этот раз из pycharm, переустановил файл requirements.txt, и все заработало.

Возможно, у меня была какая-то тонкая ошибка в конфигурации pycharm, которая была каким-то образом исправлена ​​путем создания venv из pycharm. Может быть, какая-то странная штука с Windows.

person Tim Richardson    schedule 24.11.2019