如何将参数传递到类中以创建PyODBC的Python单例模式包装器实例?
为了寻找人们用来包装PyODBC的类模式的示例,我在SO:找到了这个示例 我不理解DBConnection类在原始示例中是如何工作的。DBConnector是如何初始化的-- --不将所需的初始值传递给如何将参数传递到类中以创建PyODBC的Python单例模式包装器实例?,python,singleton,pyodbc,qodbc,Python,Singleton,Pyodbc,Qodbc,为了寻找人们用来包装PyODBC的类模式的示例,我在SO:找到了这个示例 我不理解DBConnection类在原始示例中是如何工作的。DBConnector是如何初始化的-- --不将所需的初始值传递给DBConnector()?当我尝试添加它们时,我得到TypeError:DBConnection()不接受任何参数 import pyodbc class DBConnector(object): def __new__(cls, *args, **kwargs):
DBConnector()
?当我尝试添加它们时,我得到TypeError:DBConnection()不接受任何参数
import pyodbc
class DBConnector(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = super(DBConnector, cls).__new__(cls)
return cls.instance
def __init__(self, ipaddress, port, dsn, remotedsn):
self.ipaddress = ipaddress
self.port = port
self.dsn = dsn
self.remotedsn = remotedsn
self.dsnstr_default = 'OpenMode=F;OLE DB Services=-2;'
self.dbconn = None
# creates new connection
def create_connection(self):
return pyodbc.connect(self.dsnstr_default,
IPAddress = self.ipaddress,
Port = self.port,
DSN = self.dsn,
RemoteDSN = self.remotedsn,
autocommit=True)
# For explicitly opening database connection
def __enter__(self):
self.dbconn = self.create_connection()
return self.dbconn
def __exit__(self):
self.dbconn.close()
class DBConnection(object):
connection = None
@classmethod
def get_connection(cls, new=False, *args, **kwargs): << ADDED THIS
if new or not cls.connection:
cls.connection = DBConnector(*args, **kwargs).create_connection()
/\/\/\/\/\/\/\/\/\/SEE NOTE
return cls.connection
@classmethod
def GetCompanyInfo(cls):
"""execute query on singleton db connection"""
connection = cls.get_connection()
try:
connection.setencoding('utf-8')
cursor = connection.cursor()
except pyodbc.ProgrammingError:
connection = cls.get_connection(new=True)
cursor = connection.cursor()
# Start Query
cursor.execute("SELECT CompanyName, EIN, SSN FROM Company")
for cname, ein, ssn in cursor.fetchall():
result = (cname, ein, ssn)
# End Query
cursor.close()
return result
现在我很好奇
如果我把连接和查询都放在一个类中——Monster类,我就可以完成
或者我更了解Car>bluecaroop模式,在SO的另一篇文章中,我举了一个例子。这对我来说更有意义
现在我真的很好奇原作是如何运作的:
@classmethod
def get_connection(cls, new=False):
"""Creates return new Singleton database connection"""
if new or not cls.connection:
cls.connection = DBConnector().create_connection()
return cls.connection
如何在没有INIT的情况下将参数放入DBConnection类?帖子也被标记为Django,所以他们可能跳过了假定的Django上下文?还是Django免费提供的
a = DBConnector('127.0.0.1', '4500', 'pyauto_local', None)
a.create_connection()
# <pyodbc.Connection at 0x5772110>
a = DBConnector('127.0.0.1', '4500', 'pyauto_local', None)
a.__enter__()
# <pyodbc.Connection at 0x605f278>
a.__exit__()
cls.connection = DBConnector('127.0.0.1', '4500', 'pyauto_local', None).create_connection()
/\/\/\/\/\/\/ NOTED ABOVE
# Testing
cx = DBConnection()
cx.GetCompanyInfo()
# ('Zep', '12-3456789', None)
@classmethod
def get_connection(cls, new=False):
"""Creates return new Singleton database connection"""
if new or not cls.connection:
cls.connection = DBConnector().create_connection()
return cls.connection