1. ホーム
  2. python

SQL Server に接続するための Django の設定ガイドライン

2022-02-11 03:27:56

元記事:CSDN:sam、ソースはこちら http://blog.csdn.net/samed https://blog.csdn.net/samed/article/details/51012627

1. 前書き
Django はいくつかのデータベースバックエンド (mysql, oracle, sqllite3 (default), postgresql_psycopg2) しか内蔵していないので、 Microsoft SQL Server はネイティブにはサポートされていません。
さて、これまでの試行錯誤と、公式ドキュメントを参考にして、django-pyodbc を使ってようやく解決しました。
まず、私のローカル設定環境。

1.win7、win8

2. Python 2.7

3. django1.7.1

2. ダウンロード
ダウンロードされるコンテンツは以下の通りです。

1. django-mssql 1.6.1 (django-sqlserver 1.7 の依存関係の1つ)

2.  pypiwin32 219  (django-sqlserverの依存関係の1つ)

3. django-pytds   (django-sqlserverの依存関係の1つ)

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 は、実は pypi.python.org に行かなくてもダウンロードでき、pip や easy_install で簡単にインストールできますが、私のテスト環境は某事業者のイントラネットで、プロキシサーバが必要 しかし私のテスト環境が、某事業者のイントラネットで、プロキシサーバとダイアルアップ認証を必要とするので、cmd window は 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 [Focus] settings.pyを修正しました。(django_sqlserver, django_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_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_sqlservertestappviews.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'tester', Sex=True, Birthday='2016-03-30', JoinTime=datetime.now())
        s.save()
        Info = u'inserted successfully'
    except:
        Info = u'Insert failed'
    return HttpResponse(Info)

# -*- coding: utf-8 -*-
from django.db import models

# Create your models here.
class Staff(models.Model):
    LoginID = models.CharField(u'LoginName', max_length=20)
    Name = models.CharField(u'Name', max_length=10)
    Sex = models.BooleanField(default=True)
    Birthday = models.CharField(max_length=20, null=True)
    JoinTime = models.DateTimeField()


3.6 models.py。(django_sqlservertestappmodels.py)

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
│
│ The contents of this folder are omitted
│
└─testapp
│ admin.py
│ models.py
│ tests.py
│ views.py
│ __init__.py
│ 
└─migrations
0001_initial.py
__init__.py


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() 




3.7 [フォーカス] sqlserverのバックエンド。

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 上記2つのフォルダをプロジェクトのルート(django_sqlserver)に入れる。

上記の手順が終わると、プロジェクトファイルは以下のような状態になります。

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

  1. 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
    
    
    
    │
    
    
    
    │ The contents of this folder are omitted
    
    
    
    │
    
    
    
    └─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 
    
    
    
    
    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() 
    
    
    
    
    
    
    
    

通常、1行のデータが出力されますが、出力されない場合は、このデータベースユーザーの権限を確認してください。

4.2. django-pyodbc による sql server データベースへの接続テスト。

プロジェクトのルートで manage.py シェルを実行し、dp コマンドラインモードにします。


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

結果は、4.1 と同じになるはずです。

5 プロジェクトの実行

エラーなく4.2まで行けば、理論上は問題なく動作するはずです。

5.1 まず、テーブルのビルド文を作成します。

manage.py makemigrations

5.2 データベースの同期を実行する。

manage.py syncdb

完成すると、データベースには django_migrations と testapp_staff の2つのテーブルがあるはずです。

5.3 テストサーバーが稼働しています。

manage.py runserver

5.3.1 最初にサイトの可用性をテストする

ブラウザで開く: http://localhost:8000/

サイトが正常に動作しており、データベースのテーブル内にまだデータがないことを示します。

5.3.2 次に、データの挿入をテストする

ブラウザで開く: http://localhost:8000/insertdata /

データが正しく挿入できることを示す。

5.3.3 データベースデータ読み込みのテスト

再びホームページを開くと、次のようなことがわかります。

データベースの読み込みに成功しました。

6. よくあるエラーと解決策

6.1 

エラーです。('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)')

翻訳するには

エラー: ('IM002', '[Microsoft][ODBC Driver Manager] データソース名が見つからず、デフォルトドライバが指定されていない (0) (SQLDriverConnect)')

解析と解決

こちらは、データベースのIP/ポート/データベース名が間違って書かれている可能性があるので、確認してみてください。デフォルトのポート1433を使う予定なら、それも追加してエラーを回避してください。

6.2 

BaseDatabaseWrapper のサブクラスは、 _start_transaction_under_autocommit() メソッドを必要とするかもしれません。 

解析する。

バックエンドが正しく読み取れないことが原因です。

解決方法

1. 3.7 に従って sqlserver がプロジェクトルートに置かれているかどうかを確認し、置かれていない場合は 3.7 をやり直します。

2. django-sqlserver がインストールされていることを確認し、インストールされていない場合はインストールします。

3. 設定の DATABASE 設定が ENGINE for sqlserver であるかどうかを確認し、なければ sqlserver に設定します (テスト済み、ここに django_pyodbc を記入しても動作します)。

6.3

例外です。ado と pytds の両方が利用できません。pytds をインストールするには、pip install python-tds を実行してください。 
ImportError: sqlserver.compiler という名前のモジュールがありません。

解析する。

これは依存関係である django-sqlserver がインストールされていないことが原因です

解決方法

django-pytdsをインストールし、テストします。

cmd shell> python

>>> インポート pytds

6.4 

ImportError: pythoncom という名前のモジュールがありません  

解析してください。

これは、django-sqlserver の依存関係がインストールされていないために起こります。

解決方法

pypiwin32をインストールし、テストしてください。

cmd shell> python

>>> インポート pythoncom

6.5 

django.core.exceptions.ImproperlyConfigured: 'sqlserver' は利用可能なデータベースバックエンドではあり ませんでした。 
django.db.backends.XXX' を使ってみてください。XXX は次のうちの1つです。 
    u'mysql'、u'oracle'、u'postgresql_psycopg2'、u'sqite3'  
エラーが発生しました。baseという名前のモジュールはありません  

解析してください。

バックエンドが正しく読み取れないことが原因です。

解決方法

6.2項参照

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

参考

1.  Linux で Django のデータベースバックエンドとして MSSQL Server を使用する

2.  django から sql サーバーへのアクセス - django-pyodbc

3.  ImportError: pythoncom という名前のモジュールがありません