2017-08-11 1 views
1

がそうであるように、私は2005、SQL Serverデータベースを読み取るためにpyodbcを使用してPythonスクリプトを持ってpyodbc使用していません。DjangoはPythonが

同じパラメータで私のdjangoプロジェクト設定でデータベースを設定しようとすると、同じデータベースからテーブルを読み取ることができません。

'second_db': { 
     'ENGINE': 'sql_server.pyodbc', 
     'NAME': 'schema', 
     'USER': 'user', 
     'PASSWORD': 'pass', 
     'HOST': 'servername', 

     'OPTIONS': { 
      'driver': 'SQL Server', 
     }, 
    }, 

Djangoプロジェクトワークスペース内のどこか:

from django.db import connection 
cursor = connection.cursor() 
cursor.execute(str.format("SELECT id FROM schema.dbo.mytable WHERE num = {0}", obj.num) 

を私が取得:

[42S02] [Microsoft][SQL Server Native Client 11.0][SQL Server]Invalid object name 'schema.dbo.mytable'. (208) (SQLExecDirectW) 

誰でも両者の差に何を検出するために私を助けることができますか? Djangoはスクリプトを実行するマシンと同じマシンで実行されているため、権限の問題ではないと思います...

標準カーソルを定義する代わりdjangoの設定内のすべてのデータベース設定、コードの周りに広がっていない。

答えて

1

最後に私の問題は、私は二デシベルではなく、デフォルトのものから、カーソルをオープンしたいということでしたので、間違いはここにあった:

from django.db import connection 
cursor = connection.cursor() 

それは次のようになりますため

from django.db import connections # instead of connection 
cursor = connections['second_db'].cursor() # using the proper db 
1

Djangoの実行形式は少し異なります。これを試して?

cursor.execute("SELECT id FROM schema.dbo.mytable WHERE num = %s", [obj.num]) 

これにより、SQLインジェクション攻撃の可能性が排除されます。

cursor.execute("SELECT id FROM schema.dbo.mytable WHERE num = ?", foo.num) 

幸運:あなたはおそらくもバインドされたパラメータを使用するようにpyodbcクエリを変更したいです!

+0

感謝アドバイス!私はあなたの提案を試して問題を発見した。 – toscanelli