Django连接SQL Server配置指引




注意,此文章由于有部分内容是错误的,因此另起一篇文章叙述:

Django连接SQL Server配置指引

http://blog.csdn.net/samed/article/details/51012627








这个东东搞了我三天,终于搞定了。


1. 前言

Django只内置了几个 Database Backend(mysql、oracle、sqllite3(默认)、postgresql_psycopg2),所以原生并不支持Microsoft SQL Server。

好在有前人的尝试,以及官方文档的介绍,终于使用django-pyodbc搞定了。

先讲我本地的配置环境:

1. win7

2. Python2.7

3. Django1.7


2. 下载

需要下载的内容包括:

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

2. django-sqlserver 1.7

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

4. django-pyodbc 0.2.8

5. pypiwin32 219  ——2015年10月26日添加,这个也是django-sqlserver的依赖之一。

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

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

如果有同样烦恼右上不了pypi.python.org的同学莫急,文章末尾含有打包好的文件下载链接。


3. 测试

全部安装完成后(如果不会安装,建议不要玩python了),分别进行pyodbc和django-pyodbc的测试:

3.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 * from some_table')
curs.fetchone()

正常情况下,会输出这个表的第一行数据,如果不能输出,检查一下这个数据库用户的权限。


3.2. django-pyodbc连接sql server数据库测试:

分两步:

3.2.1. 修改django project(下称dp)下的settings.py文件,将DATABASES 的 default修改为如下内容:

DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
    'default':{
        'ENGINE':'django_pyodbc',
        'NAME':'DB_name',
        'HOST':'127.0.0.1,1433',
        'USER':'User_Name',
        'PASSWORD':'PassWord',
        'OPTIONS': {
            'DRIVER': 'SQL Server Native Client 10.0',
        },
    }
}

3.2.2. 在dp 根目录执行manage.py shell 进入dp命令行模式:

>>> from django.db import connections
>>> curs = connections['default'].cursor()
>>> curs.execute("select * from some_table")
>>> curs.fetchone()

成功的话和1一样。

常见报错:

3.2.2.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端口,也加上,避免错误。


4. 配置

ok,如果测试通过,那么成功一大半了。

我按照前人的经验,到测试步骤,都是非常顺利的,但是这一步就花了我两天的时间去搞。

这个时候运行一下dp试试:

manage.py runserver

如果你见到如下消息:

August 29, 2015 - 13:02:10
Django version 1.7.1, using settings 'projectname.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
那么恭喜你,你人品非常地好,没有那么多啰嗦的配置,文章结束。


4.1. 报错如下:

4.1.1. 

subclasses of BaseDatabaseWrapper may require a _start_transaction_under_autocommit() method

这是因为我第一次只安装了pyodbc和django-pyodbc,并没有安装2.1/2.2中的两个sqlserver依赖backends,前人没有出现这个问题, 估计是因为使用了旧版本的django,所以不会出现这种报错(旧版可塑性非常强,因为没有那么多限制)。

报错然后就去想办法,在网上搜索那是一个痛苦,天昏地暗地看贴stackflow的帖子基本都翻遍了,都没有找到结果办法。

然后天真地想按照mysql的backends类书写sql server类,把mysql的backends研究个遍之后,写了base类、schma类,满心欢喜地运行,我去,天杀地报错铺天盖地过来。

最后,灵机一动,打算看看是否有现成的django连接sql server的网站源码,就在度娘搜索“django sql server 源码”,第一个链接就是:django-sqlserver 1.7 : Python Package Index。

受参考文献2的启发,就下载下来看,发现这里面果然有sqlserver的backends在里面。

然后就把2.2的sqlserver文件夹放在APP目录下,因为这个package说依赖2.1的包,我就把2.1下载下来,然后把里面的sqlserver_ado文件夹也放在APP目录下。

然后,因为是放在app目录下面,所以在py脚本里面的import sqlserver_ado都要修改成import appname.sqlserver_ado。

import six 改成 from django.utils import six

反正eclipse里面提示红色波浪线的都得改。


4.1.2. 、4.1.3.

Exception: Both ado and pytds are not available, to install pytds run pip install python-tds

ImportError: No module named sqlserver.compiler

改完eclipse里面提示红色波浪线,其实还不够,还要修改如下内容:

base里面的(不知道为何这里不提示波浪线):

from sqlserver_ado import dbapi as ado_dbapi
修改为:

from appname.sqlserver_ado import dbapi as ado_dbapi

operations里面的(字符串啦):

compiler_module = "sqlserver.compiler"
修改为:

compiler_module = "appname.sqlserver.compiler"


然后就ok了。

----------------------------------------------------可爱注释线--------------------------------

2015年10月26日添加

经过在几台机器上实验,发现除了sqlserver包里面的内容需要修改之外,还有一个依赖需要安装:pypiwin32。

在我第一台实验的机器上,无需安装此包,可能是有其它软件已经代为安装了,但是后续在几台机子上面,均出现了下述报错:

ImportError: No module named pythoncom

这个就是由于pypiwin32模块没有正确安装的缘故,安装之后就可以了,不安装就会提示让你安装pytds。

----------------------------------------------------可爱注释线--------------------------------

4.1.4. 

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 sqlserver.base
这个报错严格意义上讲,打错字了~囧~

settings 里面 DATABASES 的 ENGINE 有两种定义方式:

'ENGINE':'appname.sqlserver'
'ENGINE':'django_pyodbc'
二选1即可。

经过上述步骤,django 通过django-pyodbc 连接 sql server已经实现。

可以自行在module里面编写class对应表了。


-------------------------------------------------

参考文献:

1. Linux上使用MSSQL Server作为Django的Database Backend

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

3. ImportError: No module named pythoncom


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