Как использовать Django с Sql Server
Обычно я использую Postgres для своих баз данных с Django, но недавно я начал работать в компании, которая использует MSSQL в среде Windows. Короче говоря, мне пришлось переписать свойства базы данных в settings.py. К сожалению, я не знаю, как подключиться к SQL Server с помощью Pyodbc, и они используют Python 3.x, поэтому я не могу использовать Django-Pyodbc. При попытке запустить его я получаю: "Не найдено имя источника данных и не указан драйвер по умолчанию (0) (SQLDriverConnect)')"
Вот мой текущий конфиг БД в его нынешнем виде. I'm probably doing something wrong but it is very difficult to find resources since most Django+Sql Server results either use FreeTDS or Django-Pyodbc (neither are options).
'default': {
'ENGINE': 'sql_server.pyodbc',
'NAME': 'db_name_on_server',
'USER': 'my_acct',
'PASSWORD': 'nope',
'HOST': 'x.x.x.x',
'PORT': '1433',
'OPTIONS': { # Options are not edited
'driver': 'SQL Server', # What it displays as on odbc admin
'dsn': 'System DSN', # What it displays as on odbc admin
'use_legacy_datetime': False
}
4 ответа
Старый вопрос, но это может кому-то помочь. Эти параметры я использую в Windows для подключения к SQL Server. Как сказал @flipperpa, я также использую django-pyodbc-azure
pyodbc==3.0.10
django-pyodbc-azure==1.10.0.1
Тем не менее, pyodbc, который скачает pip, не работает для меня. Как предлагается в этом ответе, перейдите на этот сайт http://www.lfd.uci.edu/~gohlke/pythonlibs/ и загрузите любую из них в зависимости от установленной версии Python 3.5:
pyodbc‑3.0.10‑cp35‑none‑win32.whl
если у вас установлена 32-битная версия Python 3.5pyodbc‑3.0.10‑cp35‑none‑win_amd64.whl
если у вас установлена 64-битная версия Python 3.5
Затем используйте эти настройки для подключения:
'default': {
'ENGINE': 'sql_server.pyodbc',
'HOST': "localhost",
'USER': "--user name--",
'PASSWORD': "--password--",
'NAME': "--database name--",
'PORT': 1433,
'OPTIONS': {
'driver' : 'SQL Server Native Client 11.0',
'MARS_Connection' : True,
'driver_supports_utf8' : True,
},
}
Для тех, кто использует linux, MS выпустила официальные драйверы odbc для SQL-сервера и официально (хотя и немного молчаливо) поддерживает проект django-pyodbc-azure. Я настоятельно рекомендую использовать его, а также встроенный драйвер ODBC для SQL Server для Linux через FreeTDS.
Официальный бэкэнд-форк от Microsoft: Microsoft MSSQL Django
У них также есть эталонный образец Django базы данных SQL Azure .
Набор'ENGINE': 'mssql'
использовать его. Пример:
DATABASES = {
"default": {
"ENGINE": "mssql",
"NAME": "mydb",
"USER": "user@myserver",
"PASSWORD": "password",
"HOST": "myserver.database.windows.net",
"PORT": "",
"OPTIONS": {
"driver": "ODBC Driver 17 for SQL Server",
},
},
}
Между тем есть django-mssql-backend для поддержки MSSQL, и вот как выглядят мои настройки (Django 3.0, django-mssql-backend 2.8.1)
DATABASES = {
'default': {
'ENGINE': 'sql_server.pyodbc',
'NAME': os.getenv('DB_NAME'),
'USER': os.getenv('DB_USER'),
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': os.getenv('DB_HOST'),
'PORT': os.getenv('DB_PORT'),
'TEST': {
'NAME': os.getenv('DB_NAME'),
},
'OPTIONS': {
'driver': 'ODBC Driver 17 for SQL Server',
'extra_params': 'MARS_Connection=Yes'
},
}
}
Мне повезло со следующим стеком, и мы являемся исключительно магазином Python 3:
- FreeTDS 0,95
- pyodbc 3.0.10
- django-pyodbc-azure 1.8.3 (при условии, что Django 1.8+)
Если у вас есть odbc.ini
, odbcinst.ini
, а также freetds.conf
все в квадрате, вот пример настроек, которые работают для меня. Некоторые из них зависят от того, используете ли вы SQL Server 2008+:
DATABASES = {
'default': {
'ENGINE': 'sql_server.pyodbc',
'HOST': 'yourserver.com',
'PORT': '1433',
'NAME': 'your_db',
'USER': 'your_user',
'PASSWORD': 'your_pw',
'AUTOCOMMIT': True,
'OPTIONS': {
'driver': 'FreeTDS',
'unicode_results': True,
'host_is_server': True,
'extra_params': 'tds_version=7.2;',
},
},
}
Вам также нужно будет включить 'use_legacy_datetime': True,
если вы используете SQL Server 2005 или менее, в противном случае он будет использовать новые поля даты SQL Server 2008+. Он также автоматически установит значение true, если вы используете устаревший драйвер. Удачи!