2017-02-28 52 views
0

服務器我目前有連接到同一MSSQL數據庫許多腳本。我在每個腳本中建立連接,但爲了便於使用,我希望將連接放入模塊中,並從腳本中調用該模塊。在我的模塊connect_to_db.pyc的代碼看起來是這樣的:連接到SQL從自制模塊

import pyodbc 

def sql_connect(): 
    server="some_server.net" 
    port="1433" 
    user = "[email protected]_domain" 
    server="my_server" 
    database="my_database" 
    conn = pyodbc.connect('DRIVER={SQL Server};SERVER=my_server,1433', 
    user=user, 
    password=password, 
    database=database) 
    c=conn.cursor() 

然後,在我的劇本我嘗試調用該模塊並運行一個查詢:

from connect_to_db import sql_connect 

sql_connect() 
c.execute("SELECT * FROM table") 

我得到錯誤的名稱C沒有定義。我試圖把它定義爲一個全球性的,但它沒有幫助。這與我缺乏理解模塊有關,但我無法弄清楚。

回答

1

您可以在sql_connect功能

import pyodbc 

def sql_connect(): 
    server="some_server.net" 
    port="1433" 
    user = "[email protected]_domain" 
    server="my_server" 
    database="my_database" 
    conn = pyodbc.connect('DRIVER={SQL Server};SERVER=my_server,1433', 
    user=user, 
    password=password, 
    database=database) 
    return conn.cursor() 

返回光標,然後你可以使用它作爲

從connect_to_db進口sql_connect

c = sql_connect() 
c.execute("SELECT * FROM table") 
+0

謝謝,就像一個魅力! –

0

你的確缺少一個位有:

在功能sql_connect ,您分配給一個名爲c的本地變量。

該變量不existant之外的功能。 如果你想連接變量在模塊級的存在,也許嘗試以下嘗試:

在你的「connect_to_db.py」:

import pyodbc 

def sql_connect(): 
    server="some_server.net" 
    port="1433" 
    user = "[email protected]_domain" 
    server="my_server" 
    database="my_database" 
    conn = pyodbc.connect('DRIVER={SQL Server};SERVER=my_server,1433', 
    user=user, 
    password=password, 
    database=database) 
    return conn.cursor() 

cursor = sql_connect() 

這將創建上的水平的varibale「光標」模塊。 在另一個模塊中,簡單地執行

from connect_to_db import cursor 

導入模塊的「光標」構件。

這應該可以做到。

提示:請注意,就軟件工程而言,這種方法可能不太優雅。

編輯:

也許,你可能要更深入地面向對象編程?

class MSSQLConnector(object): 

    def __init__(self, server, port, database, user, password): 
     self.server = server 
     self.port = port 
     self.conn = pyodbc.connect('DRIVER={SQL Server};SERVER='{0}, 
      {1}.format((self.server, self.port)), user, password, database) 
    def open_cursor(self): 
     return self.conn.cursor() 

這會以這種方式被使用:

connector = MSSQLConnector("my_server", "1433", "my_database", "username", "secret-password") 
cursor = connector.open_cursor() 
+0

謝謝,這個作品!在優雅方面,你會推薦tomasmor的方法嗎?還是有更好的方法來建立呢? –

+0

@tomasmor提供了一個更清潔的解決方案。在模塊級別上實例化一個遊標有點「魔力」,通常應該避免這種情況。另外,看看python中的資源衛士,當資源超出範圍時,甚至可以方便關閉和錯誤檢查。 – DrGlitch

+0

謝謝!我擔心你會提出面向對象的程序設計......我已經能夠把自己的頭埋在沙中一段時間​​了,但我認爲我的時間已經到了...... –