Python 从自制模块连接到SQL server
我目前有许多脚本连接到同一个MSSQL数据库。我在每个脚本中建立连接,但为了便于使用,我想将连接放在一个模块中,并从脚本中调用该模块。我的模块connect_to_db.pyc中的代码如下所示: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
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()