choose from a list

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Tue Oct 30 15:36:15 EDT 2007


barronmo a écrit :
> I'm new to programming and even newer to Python and would be grateful
> for some help on what has been a tough problem for me.  The project I
> am working on is an electronic medical record using MySQL/Python.  I'm
> currrently working on a module that looks up a patient's name based on
> input from the user.
> 
> My goal is a lookup based on the first 2 or 3 letters of the patient's
> last name.  The matching results would appear as numbered choices so
> that the user would choose only a number to then access various parts
> of the patient's record.  The results might look like this for user
> input "smi":
> 
> 1  387  John Smith
> 2  453  Jane Smith
> 3  975  Joe Smithton
> 
> Here is a copy of what I have so far, name_lookup.py:
> 
> 
> import MySQLdb
> 
> def name_find(namefrag):
> 
>      conn = MySQLdb.connect(host = "localhost",
>           user = "root",
>           passwd = "n85",
>           db = "meds")

Opening (and closing) a connection to the RDBMS on each and every 
function is certainly not the best way to go.

>      cursor = conn.cursor(MySQLdb.cursors.DictCursor)
>      cursor.execute("SELECT patient_ID, firstname, lastname FROM
> demographics WHERE lastname LIKE '"+ str(namefrag)+"%'")

Please re-read both the db-api and MySQLdb docs. You should not build 
the whole query this way, but instead use (db module specific) 
plaeholders and pass actual params as a tuple, ie (if I correctly 
remember MySQLdb specificities):

cursor.execute(
    "SELECT patient_ID, firstname, lastname FROM " \
  + " demographics WHERE lastname LIKE '%s%%'),
    (namefrag, )
    )


>      results = cursor.fetchall()
>      for row in results:

Some db modules let you iterate directly over the cursor. Check if it's 
the case with MySQLdb. If so, you may want:

        for row in cursor:

instead.

>           print "%s   %s %s  %s" % (row["patient_ID"],
> row["firstname"], row["lastname"])

Python has better to offer wrt/ string formatting (assuming patient_ID 
is an integer):

            print "%(patient_ID)03d %(firstname)s, %(lastname)s" % row

> 
> Thanks in advance for any help.

wrt/ (what I guess is) your (very implicit) question, you may want to 
have a look at enumerate(iterable):

for index, item in enumerate(cursor): #or:enumerate(cursor.fetchall()):
     print i, item

HTH



More information about the Python-list mailing list