Django链接SQL Server配置指引
Django只内置了几个 Database Backend(mysql、oracle、sqllite3(默认)、postgresql_psycopg2),因此原生并不支持Microsoft SQL Server。
好在有前人的尝试,以及官方文档的介绍,终于使用django-pyodbc搞定了。
先讲我本地的配置环境:css
1. win七、win8html
2. Python2.7python
3. Django1.7.1mysql
2. 下载
须要下载的内容包括:sql
1. django-mssql 1.6.1(django-sqlserver 1.7的依赖之一)shell
2. pypiwin32 219 (django-sqlserver的依赖之一)数据库
3. django-pytds (django-sqlserver的依赖之一)django
4. django-sqlserver 1.7浏览器
5. pyodbc 3.0.10 (内含多个版本,请注意)服务器
以上6个和本文相关,其他依赖若是没有安装的,请自行安装。
其中第一、4是必须下载的,由于要解压它里面的内容放进项目中使用。
注意:pyodbc、django-pyodbc、pypiwin3二、django-pytds 这4个其实能够不用上pypi.python.org下载的,使用pip或者easy_install均可以轻松安装,可是个人测试环境在某个运营商的内网,须要经过代理服务器联网,还须要拨号认证,因此cmd窗口没法直接使用pip等工具下载。
pip安装方法:
pip install django-sqlserver django-pytds pyodbc django-pyodbc pypiwin32
3. 配置
所有安装完成后,进行项目的基本配置,其中3.一、3.2是项目大前提,含有【重点】字样的必须配置的,其它按照需求自行摸索。
3.1 创建TestProject:
django-admin startproject django_sqlserver
3.2 创建TestApp:
django-admin startapp testapp
3.3 【重点】修改settings.py:(django_sqlserver\django_sqlserver\settings.py)
#省略部份内容
INSTALLED_APPS = ( # 'django.contrib.admin', # 'django.contrib.auth', # 'django.contrib.contenttypes', # 'django.contrib.sessions', # 'django.contrib.messages', # 'django.contrib.staticfiles', 'testapp', )
#省略部份内容
DATABASES = { # 'default': { # 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } 'default': { 'ENGINE': 'sqlserver', 'NAME': 'DjangoTest', 'HOST': '127.0.0.1', 'PORT': '1433', 'USER': 'DjangoTest', 'PASSWORD': 'DjangoTest', 'OPTIONS': { 'DRIVER': 'SQL Server Native Client 10.0', }, } }#省略部份内容
LANGUAGE_CODE = 'zh-CN'#省略部份内容
3.4 urls.py:(django_sqlserver\django_sqlserver\urls.py,下面几个文件内容较少,我就直接贴上来了)
from django.conf.urls import patterns, include, url # from django.contrib import admin urlpatterns = patterns('', # Examples: url(r'^$', 'testapp.views.home'), url(r'^insertdata/$', 'testapp.views.insertdata'), # url(r'^blog/', include('blog.urls')), # url(r'^admin/', include(admin.site.urls)), )
3.5 views.py:(django_sqlserver\testapp\views.py)
# -*- coding:utf-8 -*- from django.shortcuts import render, HttpResponse from models import Staff from datetime import datetime def home(req): QuerySet = Staff.objects.all() Info = 'World' for Item in QuerySet: print Item.Name Info = Item.Name return HttpResponse('Hello %s!' % Info) def insertdata(req): try: s = Staff(LoginID='aa', Name=u'测试人员', Sex=True, Birthday='2016-03-30', JoinTime=datetime.now()) s.save() Info = u'插入成功' except: Info = u'插入失败' return HttpResponse(Info)
3.6 models.py:(django_sqlserver\testapp\models.py)
# -*- coding: utf-8 -*- from django.db import models # Create your models here. class Staff(models.Model): LoginID = models.CharField(u'登录名', max_length=20) Name = models.CharField(u'姓名', max_length=10) Sex = models.BooleanField(default=True) Birthday = models.CharField(max_length=20, null=True) JoinTime = models.DateTimeField()
3.7 【重点】sqlserver的backend:
3.7.1 django_mssql-1.6.1-py2.py3-none-any.whl 重命名为 django_mssql-1.6.1-py2.py3-none-any.rar,解压获得 sqlserver_ado文件夹。
3.7.2 解压 django-sqlserver-1.7.tar.gz 获得 sqlserver 文件夹。
3.7.3 把上述两个文件夹放入项目根目录(django_sqlserver\)。
进行完以上步骤后,项目文件状况应该是以下状态:
django_sqlserver │ db.sqlite3 │ manage.py │ ├─django_sqlserver │ settings.py │ urls.py │ wsgi.py │ __init__.py │ ├─sqlserver │ base.py │ compiler.py │ creation.py │ operations.py │ schema.py │ __init__.py │ ├─sqlserver_ado │ │ 此文件夹内容省略 │ └─testapp │ admin.py │ models.py │ tests.py │ views.py │ __init__.py │ └─migrations 0001_initial.py __init__.py
4. 测试配置完毕,须要分别进行pyodbc和django-pyodbc的测试:
4.1. pyodbc链接sql server数据库测试:
-
import pyodbc
-
-
connection = pyodbc.connect( 'DRIVER={SQL Server Native Client 10.0};SERVER=127.0.0.1;DATABASE=DB_name;UID=User_Name;PWD=PassWord')
-
curs = connection.execute( 'select GETDATE()')
-
curs.fetchone()

正常状况下,会输出一行数据,若是不能输出,检查一下这个数据库用户的权限。
4.2. django-pyodbc链接sql server数据库测试:
在项目根目录执行manage.py shell进入dp命令行模式:
-
from django.db import connections
-
curs = connections[ 'default'].cursor()
-
curs.execute( "select * from some_table")
-
curs.fetchone()

结果应该是和4.1同样的。
5 运行项目
若是到达4.2没有出错,那么理论上应该是能够正常运行的了。
5.1 首先建立建表语句:
manage.py makemigrations
5.2 执行数据库同步:
manage.py syncdb
完成后数据库应该有两个表:django_migrations、testapp_staff
5.3 测试服务器运行:
manage.py runserver
5.3.1 先测试站点可用性
浏览器中打开:http://localhost:8000/
说明站点运行成功,且数据库表里面尚未数据。
5.3.2 接下来测试插入数据
浏览器中打开:http://localhost:8000/insertdata/
说明能够正常插入数据的。
5.3.3 测试数据库数据读取
再从新打开主页,能够看到:
成功读取数据库。
6. 常见错误及解决方案
6.1
Error: ('IM002', '[IM002] [Microsoft][ODBC \xc7\xfd\xb6\xaf\xb3\xcc\xd0\xf2\xb9\xdc\xc0\xed\xc6\xf7] \xce\xb4\xb7\xa2\xcf\xd6\xca\xfd\xbe\xdd\xd4\xb4\xc3\xfb\xb3\xc6\xb2\xa2\xc7\xd2\xce\xb4\xd6\xb8\xb6\xa8\xc4\xac\xc8\xcf\xc7\xfd\xb6\xaf\xb3\xcc\xd0\xf2 (0) (SQLDriverConnect)')
翻译一下:
Error: ('IM002', '[IM002] [Microsoft][ODBC 驱动程序管理器] 未发现数据源名称而且未指定默认驱动程序 (0) (SQLDriverConnect)')
分析及解决:
这个有多是数据库的IP/端口/数据库名写错了,检查一下。若是打算用默认的1433端口,也加上,避免错误。
6.2
subclasses of BaseDatabaseWrapper may require a _start_transaction_under_autocommit() method
分析:
这是因为backend未能正常读取致使的。
解决方案:
1. 检查是否按照3.7 把 sqlserver 放入项目根目录,如否,则重作3.7;
2. 检查django-sqlserver是否已经安装,如否,则安装;
3. 检查 settings 中的 DATABASE 设置是否ENGINE 为 sqlserver,如否,则设置为sqlserver(经测试,此处填写django_pyodbc一样也能够)
6.3
Exception: Both ado and pytds are not available, to install pytds run pip install python-tds
ImportError: No module named sqlserver.compiler
分析:
这是因为django-sqlserver 的 依赖没有安装致使的
解决方案:
安装django-pytds并测试:
cmd shell> python
>>> import pytds
6.4
ImportError: No module named pythoncom
分析:
这是因为django-sqlserver 的 依赖没有安装致使的
解决方案:
安装pypiwin32并测试:
cmd shell> python
>>> import pythoncom
6.5
django.core.exceptions.ImproperlyConfigured: 'sqlserver' isn't an available database backend.
Try using 'django.db.backends.XXX', where XXX is one of:
u'mysql', u'oracle', u'postgresql_psycopg2', u'sqlite3'
Error was: No module named base
分析:
这是因为backend未能正常读取致使的。
解决方案:
参考6.2
-------------------------------------------------
参考文献:
1. Linux上使用MSSQL Server做为Django的Database Backend