您如何使用 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>

我有两个问题。

  1. 我不习惯通过 API 使用 OS,而且我找不到很多不在 C++ 中的文档或用法示例。也就是说,代码 运行s,它永远不会 returns 为真。
  2. 我不知道如何让它踢出错误信息以便诊断问题。此代码不会在日志中留下痕迹,因此事件查看器中不会显示任何错误。

我该如何解决这个问题?走这条路我什至做了正确的事吗?使用 Python 连接到数据库的最佳实践究竟是什么?

这个问题实际上有两个答案。

  1. 您可以通过从 Python 调用 PowerShell 脚本来实现。

  2. 你不知道。您在连接字符串中使用了受信任的连接。

我选择了选项 2。