2017-02-28 16 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_connectcという名前のローカル変数に割り当てます。

その変数は、関数外に存在しません。あなたの「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

ありがとう、これは動作します!エレガンスの面では、トマスのアプローチをお勧めしますか?または、これを構築するためのより良い方法がありますか? –

+0

エレガントな空間で、@tomasmorははるかにクリーンなソリューションを提供しました。モジュールレベルでインスタンス化されたカーソルを持つことは少し「魔法」ですが、一般的に避けるべきです。また、リソースがスコープ外に出たときに終了とエラーチェックを容易にする、Pythonのリソースガードを見てください。 – DrGlitch

+0

ありがとう!私はあなたがオブジェクト指向のプログラミングを生み出すことになるのではないかと心配していました...私はかなり長い間頭を砂の中に置くことができましたが、私の時が来たと思います... –

関連する問題