How to connect Python to Db2

前端 未结 10 518
小鲜肉
小鲜肉 2020-12-04 19:53

Is there a way to connect Python to Db2?

相关标签:
10条回答
  • 2020-12-04 20:03

    After lots of digging I discovered how to connect with DB2 using ibm_db.

    First off, if you use a python version higher than 3.2 use

    pip install ibm_db==2.0.8a

    version 2.0.8 (the latest) will fail to install.

    then use the following to connect

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

    list tables with

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

    and execute SQL with

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

    check this link for official not so accurate documentation

    0 讨论(0)
  • 2020-12-04 20:04

    In addition to @prof1990 response:

    Since 2.0.9 (Aug 16th 2018), also with Python 3 you can simply use:

    pip install ibm_db
    

    Reference:

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

    Example of connection here:

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

    Full API documentation here:

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

    0 讨论(0)
  • 2020-12-04 20:05

    IBM's Db2 is available for various platforms. If you are trying to connect to a Db2 which lives on an IBM i server (formerly known as AS/400, iSeries, or System i), then ibm_db requires a product called Db2 Connect, which is rather expensive. Most people who use Python to connect to Db2 for i use ODBC (usually through PyODBC).

    I'm not completely sure about the situation with Db2 on their z (mainframe) servers, but I would think it also requires Db2 Connect.

    0 讨论(0)
  • 2020-12-04 20:10

    The documentation is difficult to find, and once you find it, it's pretty abysmal. Here's what I've found over the past 3 hours.

    You need to install ibm_db using pip, as follows:

    pip install ibm_db
    

    You'll want to create a connection object. The documentation is here.

    Here's what I wrote:

    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>;', '', '')
    

    Next you should know that commands to ibm_db never actually give you results. Instead, you need to call one of the fetch methods on the command, repeatedly, to get the results. I wrote this helper function to deal with that.

    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.
    

    Now with that helper function defined, you can easily do something like get the information on all the tables in your database with the following:

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

    If you'd like to see everything in a given table, you could do something like this now:

    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))
    

    And now rows contains a list of rows from the 170th table in your database, where every row contains a dict of column name: value.

    Hope this all helps.

    0 讨论(0)
  • 2020-12-04 20:10

    Version: ibm-db 3.0.2 - ibm-db==3.0.2

    pip install ibm-db
    

    Released: Jun 17, 2020

    Connect to a local or cataloged database:

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

    Connect to an uncataloged database:

    import ibm_db
    ibm_db.connect("DATABASE=name;HOSTNAME=host;PORT=60000;PROTOCOL=TCPIP;UID=username;
                PWD=password;", "", "")
    
    0 讨论(0)
  • 2020-12-04 20:11

    ibm-db, the official DB2 driver for Python and Django is here:

    • https://code.google.com/p/ibm-db/

    Here's a recent tutorial for how to install everything on Ubuntu Linux:

    • http://programmingzen.com/2011/05/12/installing-python-django-and-db2-on-ubuntu-11-04/

    I should mention that there were several older unofficial DB2 drivers for Python. ibm-db is the one you should be using.

    0 讨论(0)
提交回复
热议问题