您如何使用 Python 3 管理 Windows 上的 DSN?
How do you manage DSNs on Windows with Python 3?
我更喜欢使用 DSN 连接到数据库。我不喜欢将用户名和密码放在代码或配置文件中,也不喜欢可信连接方法。
当我 google 如何使用 Python 管理 DSN 时,我得到了下面的一些变体。
import ctypes
ODBC_ADD_DSN = 1 # Add data source
ODBC_CONFIG_DSN = 2 # Configure (edit) data source
ODBC_REMOVE_DSN = 3 # Remove data source
ODBC_ADD_SYS_DSN = 4 # add a system DSN
ODBC_CONFIG_SYS_DSN = 5 # Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6 # remove a system DSN
def create_sys_dsn(driver, **kw):
"""Create a system DSN
Parameters:
driver - ODBC driver name
kw - Driver attributes
Returns:
0 - DSN not created
1 - DSN created
"""
nul = chr(32)
attributes = []
for attr in kw.keys():
attributes.append("%s=%s" % (attr, kw[attr]))
if (ctypes.windll.ODBCCP32.SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, driver, nul.join(attributes))):
return True
else:
print(ctypes.windll.ODBCCP32.SQLInstallerError)
return False
if __name__ == "__main__":
if create_sys_dsn("SQL Server",SERVER="server name", DESCRIPTION="SQL Server DSN", DSN="SQL SERVER DSN", Database="ODS", Trusted_Connection="Yes"):
print ("DSN created")
else:
print ("DSN not created")
当你运行这个时,我最终将这个作为输出:
<_FuncPtr object at 0x0000028E274C8930>
我有两个问题。
- 我不习惯通过 API 使用 OS,而且我找不到很多不在 C++ 中的文档或用法示例。也就是说,代码 运行s,它永远不会 returns 为真。
- 我不知道如何让它踢出错误信息以便诊断问题。此代码不会在日志中留下痕迹,因此事件查看器中不会显示任何错误。
我该如何解决这个问题?走这条路我什至做了正确的事吗?使用 Python 连接到数据库的最佳实践究竟是什么?
这个问题实际上有两个答案。
您可以通过从 Python 调用 PowerShell 脚本来实现。
你不知道。您在连接字符串中使用了受信任的连接。
我选择了选项 2。
我更喜欢使用 DSN 连接到数据库。我不喜欢将用户名和密码放在代码或配置文件中,也不喜欢可信连接方法。
当我 google 如何使用 Python 管理 DSN 时,我得到了下面的一些变体。
import ctypes
ODBC_ADD_DSN = 1 # Add data source
ODBC_CONFIG_DSN = 2 # Configure (edit) data source
ODBC_REMOVE_DSN = 3 # Remove data source
ODBC_ADD_SYS_DSN = 4 # add a system DSN
ODBC_CONFIG_SYS_DSN = 5 # Configure a system DSN
ODBC_REMOVE_SYS_DSN = 6 # remove a system DSN
def create_sys_dsn(driver, **kw):
"""Create a system DSN
Parameters:
driver - ODBC driver name
kw - Driver attributes
Returns:
0 - DSN not created
1 - DSN created
"""
nul = chr(32)
attributes = []
for attr in kw.keys():
attributes.append("%s=%s" % (attr, kw[attr]))
if (ctypes.windll.ODBCCP32.SQLConfigDataSource(0, ODBC_ADD_SYS_DSN, driver, nul.join(attributes))):
return True
else:
print(ctypes.windll.ODBCCP32.SQLInstallerError)
return False
if __name__ == "__main__":
if create_sys_dsn("SQL Server",SERVER="server name", DESCRIPTION="SQL Server DSN", DSN="SQL SERVER DSN", Database="ODS", Trusted_Connection="Yes"):
print ("DSN created")
else:
print ("DSN not created")
当你运行这个时,我最终将这个作为输出:
<_FuncPtr object at 0x0000028E274C8930>
我有两个问题。
- 我不习惯通过 API 使用 OS,而且我找不到很多不在 C++ 中的文档或用法示例。也就是说,代码 运行s,它永远不会 returns 为真。
- 我不知道如何让它踢出错误信息以便诊断问题。此代码不会在日志中留下痕迹,因此事件查看器中不会显示任何错误。
我该如何解决这个问题?走这条路我什至做了正确的事吗?使用 Python 连接到数据库的最佳实践究竟是什么?
这个问题实际上有两个答案。
您可以通过从 Python 调用 PowerShell 脚本来实现。
你不知道。您在连接字符串中使用了受信任的连接。
我选择了选项 2。