Django-pydobc проблемы с SQL-сервером на Windows

Другой разработчик и я настраиваем проект django (v1.4.2), используя устаревшую базу данных SQL-сервера (SQLEXPRESS) на другом сервере. До сих пор мы могли подключаться к базе данных из Linux и Mac, используя django-pyodbc, и с ноутбука, работающего под управлением Windows 7, используя django-mssql. Я хотел бы использовать django-pyodbc на ноутбуке для синхронизации среды.

На ноутбуке:

  • pyodbc (3.0.6) установлен и в не-django .py скрипте я могу подключиться и запустить SQL-операторы
  • Скачал django-pyodbc 1.4, скачав zip; Я не уверен, что правильно установил:
    • Я распаковал файл и запустил файл setup.py в верхнем каталоге; он помещает каталог sql_server в каталог /lib/site-packages
  • Скопировал этот каталог sql_server в /django/db/backends
  • Создана переменная среды PYTHONPATH, указывающая на /django/db/backends/sql_server
    • не уверен, что вместо этого он должен указывать на /site-packages/sql_server?
  • Создан источник данных ODBC (системный DSN)
    • тестирование варианта подключения работает
  • Изменена запись в DATABASE в settings.py, чтобы она почти соответствовала версии linux (подробности ниже)

Итак, это не работает, и я получаю следующее сообщение об ошибке, и понятия не имею, что делать дальше:

('08001', '[08001] [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server does not exist or access denied. (17) (SQLDriverConnect); [01000] [Microsoft][ODBC SQL Server Driver][DBNETLIB]ConnectionOpen (Connect()). (53); [01S00] [Microsoft][ODBC SQL Server Driver]Invalid connection string attribute (0)')

Я настраиваю файл django settings.py следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sql_server.pyodbc',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'something_else',
        'HOST': 'mssqlx',
        'PORT': '12345',
        'OPTIONS': {
            'driver': 'SQL Server',
        },
    },
}

В linux мой файл настроек имеет запись DATABASES, например:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sql_server.pyodbc',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'something_else',
        'HOST': 'mssqlx',       # ODBC DSN defined in /etc/freetds.conf
        'PORT': '12345',        # Probably unneeded.  Set in mssqlx
        'OPTIONS': {
            'driver': 'SQL Server',  # ODBC driver name in /etc/odbcinst.ini
            'extra_params': "TDS_VERSION=7.0"  # Probably unneeded.  Set in mssqlx
        }
    },
}

не знаю, поможет ли это решить эту проблему, но с помощью django-mssql (который работает только на windows), (рабочая) запись выглядит так:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlserver_ado',
        'NAME': 'test',
        'USER': 'test',
        'PASSWORD': 'something_else',
        'HOST': '199.555.0.10',         # changed for this example
        'PORT': '12345',
        'OPTIONS': {'provider': 'SQLOLEDB'}
    },
}

Не знаю, какая другая информация может помочь. Спасибо за любую помощь или понимание, которое вы можете предложить.

---- POST MORTEM ---- Вот что наконец сработало:

частичная запись в настройках БАЗ ДАННЫХ:

    'default': {
        'ENGINE'    : 'django.db.backends.sql_server.pyodbc',
        'NAME'      : 'test_db_name',
        'USER'      : 'test_db_user_name',
        'PASSWORD'  : 'password',
        # ODBC DSN defined in /etc/freetds.conf
        'HOST'      : 'mssql_test',
        # Ignored for Windows; Required for Linux
        'OPTIONS'   : {
            # ODBC driver name in /etc/odbcinst.ini
            'driver': 'SQL Server',
            # NOTE: dsn option is added dynamically later, for Windows
        }
    },

# The ODBC DSN name specified above as DATABASES.default.HOST is ignored on
# Windows, where it must be specified as DATABASES.default.OPTIONS.dsn instead.
# However, we haven't found a way to make DATABASES.default.OPTIONS.dsn work in
# Linux (and probably the same for Mac).  It causes the error:
#    Data source name not found, and no default driver specified 
# Therefore we add it here, but only for Windows.
# Note: The username and pwd in the windows dsn file is apparently NOT used
#       (b/c server hosts both test and prod database in same MSSQL
#       instance, both test and prod dsn files happen to work - they have the
#       same ip address and port number, but different username/password's)
#
# On 64-bit Windows, with our current 32-bit version of pyodbc, the DSN
# must be created via:
#    C:\Windows\SysWOW64\odbcad32.exe
# instead of the regular "ODBC Data Sources" app in Control Panel, which 
# invokes:
#    C:\Windows\system32\odbcad32.exe
#
#   os.name is...
#       nt      for Hans' laptop (Windows 7)
#       posix   for the "Amazon Linux AMI" (CentOS) on AWS
#       posix   for Fred's Mac
if os.name == 'nt':      # Windows
    DATABASES['cf']['OPTIONS']['dsn'] = 'mssql_test'

1 ответ

Попробуйте использовать https://github.com/michiya/django-pyodbc-azure. Это должно работать как на Linux, так и на Windows.

Затем определите параметры вашей базы данных следующим образом:

DATABASES = {
    'default': {
        'ENGINE': 'sql_server.pyodbc',
        'NAME': 'dbname',
        'HOST': 'dsn_entry',
        'PORT': 'port',
        'USER': '',
        'PASSWORD': 'pass',
        'OPTIONS': {
            'driver': 'FreeTDS',
            'dsn': 'dsn_entry',
            'host_is_server': True
        }
    }
}

Под виндой 'driver' вход в OPTIONS должно быть:

'driver': 'SQL Native Client',

Изменить: К сожалению, не смог увидеть, что вы решили проблему. Оставив мой ответ здесь в качестве ссылки.

Другие вопросы по тегам