【问题标题】:Why do psycopg2 and pyodbc connect to databases differently? And how could I translate a connection?为什么 psycopg2 和 pyodbc 连接到数据库的方式不同?我怎么能翻译一个连接?
【发布时间】:2016-04-25 14:37:11
【问题描述】:

所以我一直在努力寻找一个好的模块来查询我公司的 POSTGRES 数据库中的信息。 周围有很多模块,但我似乎只能让 pyodbc 工作。

为什么 pyodbc 的连接形式与 psycopg2 不同,后者似乎是高级模块?

我如何将我的连接查询从一个转换为另一个?


我可以像这样使用 **pyodbc** 连接到我公司的服务器,没问题。
pyodbc.connect("DRIVER={SQLServer};SERVER=some\servername;DATABASE=someDatabaseName;Trusted_Connection=yes")

但这不适用于 psycopg2

psycopg2.connect(database="someDatabaseName", host="some\servername")

psycopg2 返回:

OperationalError: 无法将主机名“some\servername”转换为 地址:未知主机



主题:
我希望有人能帮忙,我的heroku服务器根本不想安装pyodbc

【问题讨论】:

  • 请确认 RDBMS 类型 - 您的问题提到了 Postgres,但 pyodbc 代码示例引用了 SQL Server 驱动程序。它是哪一个? psycopg2 不适用于 SQL Server。
  • @Bryan 我想我在这里超出了范围。 (学习!)我想我正在访问使用 Postgres SQL 数据库设置的 SQL Server。那可能吗?更新:驱动程序是 Microsoft SQL Server。所以解决方案应该是找到另一个 ODBC 模块而不是 pyodbc 或者找到某种方式在我的服务器上安装它,因为像 psycopg2 这样的模块不起作用?
  • 我们都在学习,这就是我们在这里的原因! :) 无法在 SQL Server 上托管 Postgres 数据库,这些软件产品是互斥的。

标签: postgresql python-2.7 heroku psycopg2 pyodbc


【解决方案1】:

pyodbc 是一个 Python 模块,可用于使用 ODBC API 连接到许多不同类型的数据库。具体来说,pyodbc 符合 DB API 2.0 规范。

您的工作代码示例使用 SQL Server 驱动程序的 ODBC 实现来连接到 SQL Server 实例。 驱动程序是特定于 DBMS 的,ODBC 不是。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。我想重新使用 pyodbc 使用的 ODBC 连接详细信息,以使用 psycopg2 连接到 PostgreSQL 数据库。

    可以在 Windows 注册表中找到连接详细信息。

    基本上,以下代码将从注册表中提取所需的详细信息:

    import os
    from winreg import (
        ConnectRegistry,
        HKEY_LOCAL_MACHINE,
        OpenKeyEx,
        QueryValueEx,
    )
    
    def odbc_dsn_2_psyopg2dsn(odbc_dsn, user, pwd ):
        """
        This function converts a windows ODBC DSN to a dsn 
        that can be used by psycopg2.
    
    It reads connection parameters from the windows registry,
      username and password are often not in there,
      and can be supllied as parameters. 
    
    """
    # get hostname, port, sslmode from odbc registry 
    hreg = ConnectRegistry(None,HKEY_LOCAL_MACHINE)
    key  = f"SOFTWARE\\ODBC\\ODBC.INI\\{odbc_dsn}"
    hkey = OpenKeyEx(hreg, key)
    hostname   = QueryValueEx(hkey, "Servername")[0]
    portnumber = QueryValueEx(hkey, "Port")[0]
    sslmode    = QueryValueEx(hkey, "SSLmode")[0]
    database   = QueryValueEx(hkey, "Database")[0]
    #set defaults for portnmumber and SSL mode (my pref, maybe in your case there are in the registry too)
    if not portnumber:
        portnumber = "5432"
    if not sslmode:
        sslmode = 'Prefer'
        
    # using all of the above, create psycopg2 connection-dsn
    return f"dbname={database} user={user} password={pwd} host={hostname} port={portnumber} sslmode={sslmode}"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2022-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多