[mod_python] Why can't psycopg2 beta adapt this:

Scott Chapman scott_list at mischko.com
Fri Dec 9 17:33:35 EST 2005


Daniel J. Popowich wrote:
> Scott Chapman writes:
> 
>>Mod_Python has a StringField class and psycopg2 can't seem to adapt it 
>>correctly. Type(stringfield_string) shows as:
>><class 'mod_python.util.StringField'>
>>
>>Strings of this class have 3 extra items in dir(stringfield_string) which 
>>regular strins don't have:
>>'__dict__', '__module__', 'value'
>>
>>Here's the class definition from mod_python.util:
>>class StringField(str):
>>    """ This class is basically a string with
>>    a value attribute for compatibility with std lib cgi.py
>>    """
>>
>>    def __init__(self, str=""):
>>        str.__init__(self, str)
>>        self.value = self.__str__()
>>
>>How do I make psycopg2 deal with these correctly?  It seems like
>>there's a way to make custom "adapters" but I'm rather clueless
>>here.  I just need psycopg2 to run str() on the StringField instance
>>and it'd work great.
> 
> 
> This is a pain, I know.  I use psycopg extensively and have been
> burned more than once.  There's nothing you can really do at the
> psycopg module (afaik), but it's easy enough in your code...you can do
> one of a few things:
> 
>   1. a pain, but use str() explicitly.
> 
>   2. build your query strings using python string formatting, instead
>      of the parameters of the cursor.execute() method.  E.g.:
> 
>        cur.execute("insert into mytable (col1, col5)
>                     values ('%s', %d)" % (some_str, some_int))
> 
>      the %s will automatically call __str__() if some_str is not a
>      str.
> 
>   3. Are you still using mpservlets? (you were at one time)  If you
>      use query_vars to process your forms, your instance variables are
>      converted to str automagically.  In the attached servlet,
>      types.mps, if you call it with: types?field=abc&realstr=def the
>      output will be:
> 
> 	  field: abc
> 	  type(field): <class 'mod_python.util.StringField'>
> 	  realstr: def
> 	  type(realstr): <type 'str'>
> 

You've got a good memory Daniel!  I took what I wanted of mpservlets and made my 
own mod_python handler from it.

Here's the fix action:

import psycopg2
import psycopg2.extras
import psycopg2.extensions
import mod_python

psycopg2.extensions.register_adapter(mod_python.util.StringField, 
psycopg2.extensions.QuotedString)

Scott


More information about the Mod_python mailing list