注意,此文章由于有部分内容是错误的,因此另起一篇文章叙述:
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.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.4.1.2. 、4.1.3.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.4.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。
----------------------------------------------------可爱注释线--------------------------------
这个报错严格意义上讲,打错字了~囧~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 有两种定义方式:
二选1即可。'ENGINE':'appname.sqlserver' 'ENGINE':'django_pyodbc'
经过上述步骤,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