Django鏈接SQL Server配置指引

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. django-pyodbc 0.2.8

以上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數據庫測試:

  1.  
    import pyodbc
  2.  
     
  3.  
    connection = pyodbc.connect( 'DRIVER={SQL Server Native Client 10.0};SERVER=127.0.0.1;DATABASE=DB_name;UID=User_Name;PWD=PassWord')
  4.  
    curs = connection.execute( 'select GETDATE()')
  5.  
    curs.fetchone()


正常狀況下,會輸出一行數據,若是不能輸出,檢查一下這個數據庫用戶的權限。

 

4.2. django-pyodbc鏈接sql server數據庫測試:

在項目根目錄執行manage.py shell進入dp命令行模式:

 

  1.  
    from django.db import connections
  2.  
    curs = connections[ 'default'].cursor()
  3.  
    curs.execute( "select * from some_table")
  4.  
    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

2. django訪問sql server--django-pyodbc

3. ImportError: No module named pythoncom

相關文章
相關標籤/搜索