• Django连接SQL Server配置指引


    Django连接SQL Server配置指引

    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_sqlserverdjango_sqlserversettings.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_sqlserverdjango_sqlserverurls.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 estappviews.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 estappmodels.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 xc7xfdxb6xafxb3xccxd0xf2xb9xdcxc0xedxc6xf7] xcexb4xb7xa2xcfxd6xcaxfdxbexddxd4xb4xc3xfbxb3xc6xb2xa2xc7xd2xcexb4xd6xb8xb6xa8xc4xacxc8xcfxc7xfdxb6xafxb3xccxd0xf2 (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

  • 相关阅读:
    Spring-boot内置的程序管理监控工具-Actuator
    分表工具类(根据唯一字符串)
    ES设计及规范
    测试单元Junit一直进不去@test方法解决方案
    MAC OS怎样将普通成员升级为管理员
    elasticSearch小结
    Mysql 查询条件中字符串尾部有空格也能匹配上的问题
    gitlab进行meger代码回滚
    ES与关系型数据库的通俗比较
    kafka的生产者配置以及发送信息的三种方式
  • 原文地址:https://www.cnblogs.com/fengbo123/p/10508758.html
Copyright © 2020-2023  润新知