2017-02-28 50 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

谢谢!我担心你会提出面向对象的程序设计......我已经能够把自己的头埋在沙中一段时间​​了,但我认为我的时间已经到了...... –