help with my first use of a class

wittempj@hotmail.com martin.witte at gmail.com
Fri Oct 20 08:34:48 CEST 2006


BartlebyScrivener wrote:
> I am a mere hobbyist. Spent several hours trying to make a class,
> because I think this is an occasion where I need one. But I can't make
> it work.
>
> This code "works" (only because of the global c, which I know I'm
> supposed to avoid, by using a Class). I edited the rest to leave out
> the irrelevant formatting and printing of the quotations.
>
> I've read about Classes several times, but I don't "get" them yet.
> Obviously. If I can solve one real life problem like this, then maybe
> I'll see the light.
>
> If I understand the power of Classes correctly, I could make one that
> would allow me to make a new instance that would connect to, say, an
> SQLite3 db instead of the Access db, as well as to create more methods
> that will do different SQL searches.
>
> Thank you for any help,
>
> rd
>
> --------------------------------------
>
> import mx.ODBC.Windows as odbc
> import sys
> import random
>
> def connect():
>     global c

This means you want to use a global variable c which doesn't exist yet,
an example would be to save this code to a file:

#!/usr/bin/env python

c = 0
def test_global():
    global c
    c = 1

print c

this will print 0 when you run it

>     db='DSN=Quotations'
>     conn = odbc.DriverConnect(db)
>     c = conn.cursor()
>
> def random_quote():
>     """
>     Counts all of the quotes in MS Access database Quotations2005.mdb.
>     Picks one quote at random and displays it using textwrap.
>     """
>     c.execute ("SELECT COUNT(Quote) FROM PythonQuoteQuery")
>     # Yields the number of rows with something in the quote field
>     total_quotes = c.fetchone()
>     # Get a random number somewhere between 1 and the number of total
> quotes
>     quote_number = (random.randint(1, total_quotes[0]),)
>     # Select a quote where the ID matches that number
>     c.execute ("SELECT Author, Quote FROM PythonQuoteQuery WHERE ID=?",
> quote_number)
>     quote = c.fetchone()
>     blah blah blah
>
> def print_quote()
>     code to format and print the quote (which will also have to be
> global, unless I learn Classes!)
>
>

A class structure could look like - please bear in mind that I don't
know mx.ODBC.Windows - I guess it is not completely DB-API compliant,
as you don't use a connect method.

class SQLQuery(object):
    """Object which connects to the database and can execurte SQL
commands
    """
    def __init__(self, conn):
        """conn is a dictionary {'serverId': XX, 'userId': YY,
'passWord': ZZ}
        """
        self.connection = connect(conn['userId'], conn['passWord'],
conn['serverId'])
        self.cursor = self.__connection.cursor()

    def select(self, selectqry):
    """argument selectqry specifies a sql which returns data, like a
select
    """
    self.cursor.execute(selectqry)
    return self.cursor.fetchall()

sql = SQLQuery('serverId': 'XX', 'userId': 'YY', 'passWord': 'ZZ')
qoutes = sql.select("SELECT COUNT(Quote) FROM PythonQuoteQuery")
print quotes

> if __name__ == '__main__':
>     if len(sys.argv) == 1:

sys.argv is a list, where the first argument is the name of the running
script, the second element is the first argument, etc.

>         connect()
>         random_quote()
>         print_quote()




More information about the Python-list mailing list