Changeset 3027


Ignore:
Timestamp:
Sep 20, 2010 12:40:37 AM (11 years ago)
Author:
wehart
Message:

Explicitly adding a DB interface class for pyodbc. There are many
different ODBC drivers, and I wanted to provide a modest level of automation
for this interface.

Got the ABCD8.py example working from the Pyomo book, which loads
data from an Excel spreadsheet using pyodbc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • coopr.pyomo/trunk/coopr/pyomo/data/db_table.py

    r3025 r3027  
    5656        tmp = []
    5757        if self.options.query is None:
    58             self.options.query = 'SELECT * FROM '+self.options.table
    59         print "DATA start",self.options.query
     58            if self.options.table is None:
     59                raise IOError, "Must specify 'query' or 'table' option!"
     60            self.options.query = '"SELECT * FROM %s"' % self.options.table
     61        if not self.options.table is None:
     62            for row in cursor.columns(table=self.options.table):
     63                tmp.append(row.column_name)
     64            tmp=[tmp]
     65        #print "DATA start",self.options.query
    6066        cursor.execute(self.options.query[1:-1])
    6167        for row in cursor:
    62             print "DATA",list(row)
     68            #print "DATA",list(row)
     69            ttmp=[]
    6370            for data in list(row):
    6471                if isinstance(data,Decimal):
    65                     tmp.append(float(data))
     72                    ttmp.append(float(data))
    6673                elif data is None:
    67                     tmp.append('.')
     74                    ttmp.append('.')
    6875                else:
    69                     tmp.append(data)
    70         print 'FINAL',tmp
     76                    ttmp.append(data)
     77            tmp.append(ttmp)
     78        #print 'FINAL',tmp
    7179        #
    7280        # Process data from the table
     
    8997            del self.db
    9098
    91     def connect(self, dsn, options):
     99    def connect(self, connection, options, kwds={}):
    92100        try:
    93101            mod = __import__(options.using)
    94             args = [dsn]
     102            args = [connection]
    95103            if not options.user is None:
    96104                args.append(options.user)
    97105            if not options.password is None:
    98106                args.append(options.password)
    99             print "XXX",args
    100             return mod.connect(*args)
     107            #print "XXX",args,self.options
     108            return mod.connect(*args, **kwds)
    101109        except ImportError:
    102110            return None
    103111       
    104112
    105 for module in ['pyodbc', 'pymysql']:
     113try:
     114    import pyodbc
     115
     116    class pyodbc_db_Table(db_Table):
     117
     118        alias('pyodbc', "Manage IO with a %s database interface" % 'pyodbc')
     119
     120        def __init__(self):
     121            db_Table.__init__(self)
     122            self.using = 'pyodbc'
     123
     124        def connect(self, connection, options):
     125            if not options.driver is None:
     126                ctype = options.driver
     127            elif '.' in connection:
     128                ctype = connection.split('.')[-1]
     129            connection = self.create_connection_string(ctype, connection, options)
     130            if ctype in ['xls','excel']:
     131                return db_Table.connect(self, connection, options, {'autocommit':True})
     132            return db_Table.connect(self, connection, options)
     133       
     134        def create_connection_string(self, ctype, connection, options):
     135            if ctype in ['xls', 'excel']:
     136                return "Driver={Microsoft Excel Driver (*.xls)}; Dbq=%s;" % connection
     137            if ctype in ['mdb', 'access']:
     138                return "Driver={Microsoft Access Driver (*.mdb)}; Dbq=%s;" % connection
     139                   
     140except ImportError:
     141    pass
     142
     143
     144for module in ['pymysql']:
    106145    try:
    107146        __import__(module)
Note: See TracChangeset for help on using the changeset viewer.