2017-08-11 55 views
1

我必須使用pyodbc閱讀2005年SQL Server數據庫的python腳本:Django不使用pyodbc爲Python做

import pyodbc 
con = pyodbc.connect('DRIVER={SQL Server};SERVER=servername;DATABASE=schema;UID=user;PWD=pass') 
cursor = con.cursor() 
cursor.execute(str.format("SELECT id FROM schema.dbo.mytable WHERE num = {0}", foo.num) 

這工作得很好。

當我嘗試使用相同的參數在我的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連接而不是定義標準遊標,因爲我更喜歡有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注入攻擊媒介。您可能還想更改您的pyodbc查詢以使用綁定參數:

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

祝您好運!

+0

感謝建議!我發現嘗試提出建議的問題。 – toscanelli