Django连接SQL Server配置指引

额,之前有一篇同名的文章《Django连接SQL Server配置指引》,写的内容我后来再次校验的时候发现有部分内容是不对的。

但是修改文章的工作量太大了,所以另外开一篇文章来“重构”它(^_^),也方便后面找问题。



1. 前言
Django只内置了几个 Database Backend(mysql、oracle、sqllite3(默认)、postgresql_psycopg2),所以原生并不支持Microsoft SQL Server。
好在有前人的尝试,以及官方文档的介绍,终于使用django-pyodbc搞定了。
先讲我本地的配置环境:

1. win7、win8

2. Python2.7

3. Django1.7.1


2. 下载
需要下载的内容包括:

1. django-mssql 1.6.1(django-sqlserver 1.7的依赖之一)

2. pypiwin32 219  (django-sqlserver的依赖之一)

3. django-pytds  (django-sqlserver的依赖之一)

4. django-sqlserver 1.7

5. pyodbc 3.0.10 (内含多个版本,请注意)

6. django-pyodbc 0.2.8

以上6个和本文相关,其余依赖如果没有安装的,请自行安装。

其中第1、4是必须下载的,因为要解压它里面的内容放进项目中使用。

注意:pyodbc、django-pyodbc、pypiwin32、django-pytds 这4个其实可以不用上pypi.python.org下载的,使用pip或者easy_install都可以轻松安装,但是我的测试环境在某个运营商的内网,需要通过代理服务器联网,还需要拨号认证,所以cmd窗口无法直接使用pip等工具下载。

pip安装方法:

pip install django-sqlserver django-pytds pyodbc django-pyodbc pypiwin32


3. 配置

全部安装完成后,进行项目的基本配置,其中3.1、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()  

Django连接SQL Server配置指引_第1张图片
正常情况下,会输出一行数据,如果不能输出,检查一下这个数据库用户的权限。

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()  
Django连接SQL Server配置指引_第2张图片

结果应该是和4.1一样的。


5 运行项目

如果到达4.2没有出错,那么理论上应该是可以正常运行的了。

5.1 首先创建建表语句:

manage.py makemigrations

5.2 执行数据库同步:

manage.py syncdb

Django连接SQL Server配置指引_第3张图片

完成后数据库应该有两个表:django_migrationstestapp_staff

Django连接SQL Server配置指引_第4张图片

5.3 测试服务器运行:

manage.py runserver

Django连接SQL Server配置指引_第5张图片

5.3.1 先测试站点可用性

浏览器中打开:http://localhost:8000/

Django连接SQL Server配置指引_第6张图片

说明站点运行成功,且数据库表里面还没有数据。


5.3.2 接下来测试插入数据

浏览器中打开:http://localhost:8000/insertdata/

Django连接SQL Server配置指引_第7张图片

说明可以正常插入数据的。


5.3.3 测试数据库数据读取

再重新打开主页,可以看到:

Django连接SQL Server配置指引_第8张图片

成功读取数据库。



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

2. django访问sql server--django-pyodbc

3. ImportError: No module named pythoncom


你可能感兴趣的:(Python,Django,windows,Sql,Server)