【问题标题】:How to connect Python to Db2如何将 Python 连接到 Db2
【发布时间】:2011-08-28 00:14:30
【问题描述】:

有没有办法将 Python 连接到 Db2?

【问题讨论】:

    标签: python db2


    【解决方案1】:

    有多种方法可以从 Python 连接到 Db2。我正在尝试提供选项摘要。请注意,现在在许多环境中强制执行 SSL/TLS,这需要额外的参数(见下文)。

    Db2 和 Python 驱动程序

    Db2 不为 Python 提供一个,而是四个驱动程序(客户端)。 Db2 documentation page "Python, SQLAlchemy, and Django Framework application development for IBM Database servers" 很好地概述了四个驱动程序:

    请注意,还有其他 Python 数据库接口利用现有的 JDBC 或 ODBC 驱动程序,可用于连接到 Db2。您可以将 SQLAlchemy (ibm_db_sa) 与流行的 Flask framework 一起使用。要将 Db2 与 pandas 一起使用,请使用 ibm_db_dbi。以上所有Db2 drivers are available on GitHub 均基于 CLI(调用级接口/ODBC)。还有其他方法可以连接到 Db2,例如,通过使用基于 ODBC 的第 3 方包装器等等。

    Db2 连接

    典型的连接信息由 Db2 服务器(主机名)、端口、数据库名称和用户名/密码信息组成。如果未指定其他内容,大多数驱动程序会假定连接未加密。因此,要通过加密连接进行连接,需要更多参数。它们取决于 Db2 版本、Db2 产品的类型等等。让我们开始吧。

    Newer Db2 versions simplified the use of SSL/TLS because certificates are now part of the package。典型的连接字符串如下所示:

    conn_str='database=MYDB;hostname=db2host.example.com;port=50001;protocol=tcpip;uid=db2inst1;pwd=secret;security=SSL'
    
    ibm_db_conn = ibm_db.connect(conn_str,'','')
    

    一个重要的参数是“security=SSL”,告诉驱动程序使用encryption for the data in transit

    Db2 连接字符串可以有更多选项。这取决于启用的安全插件。有关更多链接和讨论,请参阅connecting from Python to Db2 上的此博客文章。

    【讨论】:

      【解决方案2】:

      有一种方法可以只使用 Python 请求库连接到 IBM db2。为我工作。

      第 1 步:
      转到 IBM CLOUD 仪表板 -> 导航到您的 IBM db2 实例 -> 单击“服务凭证”
      应该有一个默认的,如果没有,创建一个。该服务凭证是一本字典。复制服务凭据。

      第 2 步:

      db2id = { // service credential dictionary here //}
      api = "/dbapi/v3"
      host = db2id['https_url']+api
      userinfo = {"userid":db2id['username'],"password":db2id['password']}
      service = '/auth/tokens'
      r = requests.post(host+service,json=userinfo)
      access_token = r.json()['token']
      auth_header = {"Authorization": "Bearer "+access_token}
      
      // Connection to database established
      

      第 3 步
      现在您可以运行 SELECT、INSERT、DELETE、UPDATE 查询
      INSERT、DELETE、UPDATE 查询的格式相同。在 INSERT、DELETE、UPDATE 查询之后,必须发送 COMMIT 查询,否则不会反映更改。 (您也应该提交您的更改)
      插入/更新/删除查询

      sql = " your insert/update/delete query here "
      sql_command = {"commands":sql,"limit":1000,"separator":";","stop_on_error":"yes"}
      service = "/sql_jobs"
      r = requests.post(host+service,headers=auth_header,json=sql_command)
      sql_command = {"commands":"COMMIT","limit":1000,"separator":";","stop_on_error":"yes"}
      service = "/sql_jobs"
      r = requests.post(host+service,headers=auth_header,json=sql_command)
      

      您可以使用变量 r 来检查您的请求的状态

      选择查询

      sql = " your select query here "
      service = "/sql_jobs"
      r = requests.post(host+service,headers=auth_header,json=sql_command)
      jobid = r.json()['id']
      r = requests.get(host+service+"/"+jobid,headers=auth_header)
      results = r.json()['results']
      rows = results[0]['rows']
      

      变量 rows 将包含您的查询结果。根据您的方便使用它。

      我没有使用任何 DDL 查询。但我认为它们应该像 DML 查询一样工作。不过不确定!

      【讨论】:

      • 虽然此链接可以提供问题的答案,但有必要将所有需要的信息添加到答案中,如果链接的内容被时间删除,您的答案应该仍然提供信息。
      • @Ruli 该视频自 2018 年以来一直存在,不要认为它会被删除。将尝试在答案中包含信息:)
      • 视频已被删除,信息不在答案中,所以...
      • @RotBot 感谢您的评论...更新...干杯!
      【解决方案3】:
      # Install : ibm_db package
      # Command : pip install ibm_db
      
      import ibm_db
      import sys
      
      
      def get_connection():
          db_name = ""
          db_host_name = ""
          db_port = ""
          db_protocol = ""
          db_username = ""
          db_password = ""
      
          try:
              conn = ibm_db.connect(
              f"DATABASE = {db_name}; HOSTNAME = {db_host_name}; PORT = {db_port}; PROTOCOL = {db_protocol}; "
              f"UID = {db_username}; PWD = {db_password};", "", "")
              return conn
          except:
              print("no connection:", ibm_db.conn_errormsg())
              sys.exit(1)
      
      get_connection()
      

      【讨论】:

        【解决方案4】:

        我在 2021 年的表现如何。 你需要什么:

        • Python 3.7
        • PipEnv
        • IBM 数据库

        ibm-db 版本并不重要,但这个库只适用于 Python 3.7(当前的 Python 版本是 3.9)。

        在您的机器上安装 Python 3.7.6(这是有效的版本)。

        在您的 IDE 中创建一个新的 python 文件。

        让我们创建一个虚拟环境以确保我们将使用 Python 3.7

        pip install pipenv
        

        安装后

        pipenv install --python 3.7
        

        激活虚拟环境

        pipenv shell
        

        您可以使用pip list 来验证您是否在新的虚拟环境中 - 如果列表仅显示 3 或 4 个库,那是因为您是

        现在您可以下载 Ibm_db

        pip install ibm-db
        

        您可以将此添加到您的代码中以确认您使用的是什么版本

        from platform import python_version
        print(python_version())
        

        现在访问 DB2

        import ibm_db_dbi as db
        
        # Connect to DB2B1 (keep Protocol as TCPIP)
        conn = db.connect("DATABASE=DBNAME;HOSTNAME=hostname;PORT=port;PROTOCOL=TCPIP;UID=Your User;PWD=Your Password;", "", "")
        

        检查所有可用的表

        for t in conn.tables():
            print(t)
        

        您的 SQL 代码:

        sql_for_df = """SELECT *
                        FROM TABLE
                        WHERE ..."""
        

        可视化为 DataFrame

        首先安装 pandas,因为它不会出现在您的虚拟环境中

        pip install pandas
        

        导入到您的代码后开始玩

        import pandas as pd 
        
        df = pd.read_sql(sql_for_df, conn) 
        df.head()
        

        要退出虚拟环境,只需在终端中输入exit。 如果要删除虚拟环境,请在终端中写入pipenv --rm

        到目前为止,我能学到的几乎就是这些了。 希望对大家有帮助。

        【讨论】:

          【解决方案5】:

          版本:ibm-db 3.0.2 - ibm-db==3.0.2

          pip install ibm-db
          

          发布时间:2020 年 6 月 17 日

          连接到本地或编目数据库:

          import ibm_db
          conn = ibm_db.connect("database","username","password")
          

          连接到未编目的数据库:

          import ibm_db
          ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;
                      PWD=password;", "", "")
          

          【讨论】:

            【解决方案6】:

            IBM 的 Db2 可用于各种平台。如果您尝试连接到位于 IBM i 服务器(以前称为 AS/400、iSeries 或 System i)上的 Db2,那么 ibm_db 需要一个名为 Db2 Connect 的产品,该产品相当昂贵。大多数使用 Python 连接到 Db2 for i 的人都使用 ODBC(通常通过 PyODBC)。

            我不完全确定 Db2 在他们的 z(大型机)服务器上的情况,但我认为它也需要 Db2 Connect。

            【讨论】:

              【解决方案7】:

              除了@prof1990 response

              从 2.0.9(2018 年 8 月 16 日)开始,您也可以简单地使用 Python 3:

              pip install ibm_db
              

              参考:

              https://github.com/ibmdb/python-ibmdb#updated-ibm_db

              连接示例here:

              import ibm_db
              ibm_db.connect("DATABASE=<dbname>;HOSTNAME=<host>;PORT=<60000>;PROTOCOL=TCPIP;UID=<username>;PWD=<password>;", "", "")
              

              完整的 API 文档在这里:

              https://github.com/ibmdb/python-ibmdb/wiki/APIs

              【讨论】:

                【解决方案8】:

                经过大量挖掘,我发现了如何使用 ibm_db 连接 DB2。

                首先,如果您使用高于 3.2 的 python 版本,请使用

                pip install ibm_db==2.0.8a

                版本 2.0.8(最新)将无法安装。

                然后使用以下连接

                import ibm_db_dbi as db
                
                conn = db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;PWD=password;", "", "")
                

                列出表格
                for t in conn.tables():
                    print(t)
                

                并使用

                执行 SQL
                cursor = conn.cursor()
                cursor.execute("SELECT * FROM Schema.Table")
                for r in cursor.fetchall():
                    print(r)
                

                查看this link 获取不准确的官方文档

                【讨论】:

                • 老实说,我只是为了 2.0.8a 小费而赞成这个。我无法验证连接字符串,因为我没有 ibm_db 使用的驱动程序。我确实有一个适用于 pyodbc 的 ODBC 驱动程序,所以这就是我实际使用的。
                【解决方案9】:

                您可以使用 jaydeapi 从 python 连接到 db2 首先安装库运行 pip install jaydeapi 下载 db2jcc4.jar 然后您可以使用以下代码进行连接: 通过传递主机名、端口号、用户 ID、密码 数据库名称

                import jaydebeapi
                
                conn_src = jaydebeapi.connect(
                    'com.ibm.db2.jcc.DB2Driver',
                    ['YourHostName:PortNo/DatabaseName','userid','password'],'C:/db2jcc4.jar'
                )
                
                cursor=conn_src.cursor()
                sql = 'Select * from schemaname.TableName fetch first 100 rows only '
                
                cursor.execute(sql)
                print("fetchall:")
                result = cursor.fetchall()
                for r in result:
                    print(r)
                

                【讨论】:

                  【解决方案10】:

                  这是供将来参考:

                  Official installation docs说:

                  Python 2.5 或更高版本,不包括 Python 3.X。

                  pip install ibm_db
                  

                  它只适用于我的 Python 2.7; 3.X 没有。另外,我必须将 Python 2.7 设为默认(而不是 Python 3),这样安装才能正常运行(否则会出现安装错误)。

                  Official docs sample usage

                  import ibm_db 
                  ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username; PWD=password;", "", "")
                  

                  【讨论】:

                  • 这个答案仍然部分正确,但是情况发生了变化,ibm_db 现在在使用正确的版本时支持最高 3.6.5,有关详细信息,请参阅我的答案。
                  【解决方案11】:

                  文档很难找到,一旦找到,它就非常糟糕。以下是我在过去 3 小时内发现的内容。

                  需要使用pip安装ibm_db,如下:

                  pip install ibm_db
                  

                  您需要创建一个连接对象。 The documentation is here.

                  这是我写的:

                  from ibm_db import connect
                  # Careful with the punctuation here - we have 3 arguments.
                  # The first is a big string with semicolons in it.
                  # (Strings separated by only whitespace, newlines included,
                  #  are automatically joined together, in case you didn't know.)
                  # The last two are emptry strings.
                  connection = connect('DATABASE=<database name>;'
                                       'HOSTNAME=<database ip>;'  # 127.0.0.1 or localhost works if it's local
                                       'PORT=<database port>;'
                                       'PROTOCOL=TCPIP;'
                                       'UID=<database username>;'
                                       'PWD=<username password>;', '', '')
                  

                  接下来你应该知道ibm_db 的命令实际上永远不会给你结果。相反,您需要反复调用命令上的fetch 方法之一来获得结果。我写了这个辅助函数来处理这个问题。

                  def results(command):
                      from ibm_db import fetch_assoc
                  
                      ret = []
                      result = fetch_assoc(command)
                      while result:
                          # This builds a list in memory. Theoretically, if there's a lot of rows,
                          # we could run out of memory. In practice, I've never had that happen.
                          # If it's ever a problem, you could use
                          #     yield result
                          # Then this function would become a generator. You lose the ability to access
                          # results by index or slice them or whatever, but you retain
                          # the ability to iterate on them.
                          ret.append(result)
                          result = fetch_assoc(command)
                      return ret  # Ditch this line if you choose to use a generator.
                  

                  现在定义了该辅助函数,您可以轻松地执行以下操作,例如获取数据库中所有表的信息:

                  from ibm_db import tables
                  
                  t = results(tables(connection))
                  

                  如果您想查看给定表格中的所有内容,您现在可以执行以下操作:

                  from ibm_db import exec_immediate
                  
                  sql = 'LIST * FROM ' + t[170]['TABLE_NAME']  # Using our list of tables t from before...
                  rows = results(exec_immediate(connection, sql))
                  

                  现在rows 包含数据库中第 170 个表中的 list 行,其中每一行都包含列名的 dict:值。

                  希望这一切都有帮助。

                  【讨论】:

                  • 我得到 SQLCODE=-104 的行:rows = results(exec_immediate(connection, sql)) 知道是什么导致了这个错误吗?
                  • 不应该是这样的:sql = 'SELECT * FROM ' + t[170]['TABLE_NAME']
                  • @daixtr - 嗯... IDK。我不再使用 DB2,所以我无法验证 LIST 是否是有效命令。也许这是一个错字,我的意思是SELECT。如果您有一个 DB2 实例要检查,也许您可​​以验证然后编辑我的答案(或者在 cmets 中告诉我,如果您没有足够的代表自己做,我可以编辑它。)
                  【解决方案12】:

                  您可以使用 ibm_db 库来连接 DB2。

                  query_str = "SELECT COUNT(*) FROM table_name"
                  
                  conn = ibm_db.pconnect("dsn=write","usrname","secret")
                  query_stmt   = ibm_db.prepare(conn, query_str)
                  ibm_db.execute(query_stmt)
                  

                  【讨论】:

                  • 我们如何获得ibm_db 库?
                  • @ArtOfWarfare,只需导入它。 pip install ibm_db
                  【解决方案13】:

                  ibm-db,Python 和 Django 的官方 DB2 驱动程序在这里:

                  这是关于如何在 Ubuntu Linux 上安装所有内容的最新教程:

                  我应该提一下,有几个用于 Python 的较旧的非官方 DB2 驱动程序。 ibm-db 是您应该使用的。

                  【讨论】:

                  • 它已经过时了。它还需要 IBM_DB_DI 和 ibm_db,这需要大量的安装工作。典型的 IBM 笨拙。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-03
                  • 2018-05-31
                  • 1970-01-01
                  • 2017-03-24
                  • 2021-03-05
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多