Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从自制模块连接到SQL server_Python_Sql Server_Module - Fatal编程技术网

Python 从自制模块连接到SQL server

Python 从自制模块连接到SQL server,python,sql-server,module,Python,Sql Server,Module,我目前有许多脚本连接到同一个MSSQL数据库。我在每个脚本中建立连接,但为了便于使用,我想将连接放在一个模块中,并从脚本中调用该模块。我的模块connect_to_db.pyc中的代码如下所示: import pyodbc def sql_connect(): server="some_server.net" port="1433" user = "my_username@my_domain" server="my_server" database="m

我目前有许多脚本连接到同一个MSSQL数据库。我在每个脚本中建立连接,但为了便于使用,我想将连接放在一个模块中,并从脚本中调用该模块。我的模块connect_to_db.pyc中的代码如下所示:

import pyodbc

def sql_connect():
    server="some_server.net"
    port="1433"
    user = "my_username@my_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。我也试着把它定义为一个全球性的,但它没有帮助。这一定与我对模块缺乏理解有关,但我不知道是什么原因。

您可以在sql\u connect函数中返回游标

 import pyodbc

def sql_connect():
     server="some_server.net"
     port="1433"
     user = "my_username@my_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()
然后你就可以把它当作

从连接到数据库导入sql连接

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

你确实遗漏了一点:

在函数
sql\u connect
中,指定给名为
c
的局部变量

该变量在函数之外不存在。 如果希望在模块级别上存在连接变量,请尝试以下尝试:

在“connect_to_db.py”中:

这将在模块级别上创建一个可变“光标”。 在另一个模块中,只需执行

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()

谢谢,这个有用!在优雅方面,你会推荐托马斯莫的方法吗?还是有更好的方法来建造这个?在优雅的世界里,@tomasmor提供了一个更干净的解决方案。在模块级实例化游标有点“神奇”,通常应该避免。另外,看看python中的资源保护,当资源超出范围时,它甚至可以帮助关闭和错误检查。谢谢!我担心你会提出面向对象编程。。。我已经能够把头埋在沙子里很长一段时间了,但我想我的时间到了。。。
connector = MSSQLConnector("my_server", "1433", "my_database", "username", "secret-password")
cursor = connector.open_cursor()