Another MySQL Problem

Tapi tapi at syskall.net
Wed Jun 23 12:12:03 EDT 2010


On Wed, 23 Jun 2010 10:46:37 -0430, Victor Subervi
<victorsubervi at gmail.com> wrote:
> On Wed, Jun 23, 2010 at 10:25 AM, Stephen Hansen
> <me+list/python at ixokai.io>wrote:
> 
>> On 6/23/10 6:45 AM, Victor Subervi wrote:
>> > Hi;
>> > I have this line:
>> >
>> >   cursor.execute('select clientEmail from clients where client=%s',
>> > (string.replace(client, '_', ' ')))
>> >   clientEmail = cursor.fetchone()[0]
>> >   cursor.execute('select * from %s' % (client))
>> >
>> > client = "Lincoln_Properties"
>> > With the replacement, the interpreter complains that
mydatabase.Lincoln
>> > doesn't exist. Therefore, the first line of code isn't putting the %s
>> > replacement in quotes, as I was told by you all it would. So I add
>> > quotes to it and the interpreter complains on the second line of code
>> > that it's unsubscriptable (because it's None). What gives?
>>
>> Its very early, so excuse me if I fall asleep in the middle of the
>> response.
>>
>> First: Don't do 'string.replace(your_string, x, y)' -- that's back in
>> the very, very old days before strings themselves had all the nice
>> methods.
>>
>> Do, 'client.replace("_", " ")' instead.
>>
>> Second, you're forgetting a cardinal rule. Always, always, always,
>> include the actual tracebacks when reporting errors. Don't summarize
>> them.
>>
>> Third, I *think* the problem is-- though I may be wrong here, because
>> again, just woke up-- that you're not passing the options as a tuple.
>>
>> Consider: ("hello") is not a tuple with one item. This is a slight
>> 'wart' with Python syntax. Parens do not make tuples: *commas* do.
>> Therefore, every tuple *must* have a comma. To make a one-item tuple,
>> you must do ("hello", )
>>
> 
> Well making the changes you suggest throws this error:
> 
> A problem occurred in a Python script. Here is the sequence of function
> calls leading up to the error, in the order they occurred.
>  /var/www/html/globalsolutionsgroup.vi/mailSpreadsheet.py
>    67 </body>
>    68 </html>'''
>    69
>    70 mailSpreadsheet()
>    71
> mailSpreadsheet = <function mailSpreadsheet>
>  /var/www/html/globalsolutionsgroup.vi/mailSpreadsheet.py in
> mailSpreadsheet()
>    34   subject = 'Order From Client'
>    35   cursor.execute('select clientEmail from clients where
client="%s"',
> (client.replace('_', ' '),))
>    36   clientEmail = cursor.fetchone()[0]
>    37   cursor.execute('select * from %s', (client,))
>    38   data = cursor.fetchall()
> clientEmail = 'jpage at lpc.com', cursor = <MySQLdb.cursors.Cursor object>,
> cursor.fetchone = <bound method Cursor.fetchone of
<MySQLdb.cursors.Cursor
> object>>
> 
> TypeError: unsubscriptable object
>       args = ('unsubscriptable object',)
> 
> Please advise.
> TIA,
> beno

You should strongly consider reading the DB API 2.0 documentation :
http://www.python.org/dev/peps/pep-0249/

.fetchone() 
          
            Fetch the next row of a query result set, returning a
            single sequence, or None when no more data is
            available. [6]

You script fails because the request returns no results, and fetchone()
returns None.
Evaluating None[0] is invalid, so you get an exception.

Test fetchone() return value before accessing it as a sequence, and
everything should be OK :

row = cursor.fetchone()
if row is None:
    # error handling, i.e.:
    raise CustomException("Client not found")
clientEmail = row[0]
...



More information about the Python-list mailing list