Re: callproc, string formatting

Brian Jones <[email protected]>
Newsgroups gmane.comp.python.db.psycopg.devel
Message-ID <[email protected]>
Hi Eric,

See the last reply I sent -- maybe the solution I came up with can help
simplify your code.

HTH.
brian

On Wed, Nov 25, 2009 at 2:42 PM, Eric Chamberlain <
Eric.Chamberlain-/Guk6kGqSwklJZD/[email protected]> wrote:

>  I ran into this problem a few months back.  I use a prepared statement
> mix-in to get the job done as I wasn't able to get psycopg2 to escape
> strings as it should (maybe there's an API call I'm missing?).  Here is a
> link to a mix-in that got me started.  I made heavy modifications to it to
> make it work for my needs, but at least it's one option.
>
>  http://code.activestate.com/recipes/576698/
>
>  Other things to consider are:
> > Is the proc in a schema that your user doesn't have in their search path?
>  If so, put the schema name in front of the proc name.
> > Does that proc have two instances of itself with the same number of args?
>  If so, you may need to explicitly cast the arguments being passed to the
> function.  for instance, replace %(state)s with %(state)s::VARCHAR or
> whatever that functions parameter is for that proc.
> > Does the proc exist in the database?  I know it's a dumb question, but
> maybe it got removed because of a drop cascade or some other such nonsense.
>
>   Eric Chamberlain
>
>
>  On Nov 25, 2009, at 8:23 AM, Brian Jones wrote:
>
> Hi all,
>
> I haven't used psycopg2 since 2006 or so, and didn't use it to call server
> side functions, so I'm a bit out of phase and could use some clarification:
>
> I need to call a server side function called 'myapp.new_user'. My first
> attempt looked something like this:
>
> --------------------------- snip ---------------------------
> qdict = {'fname': self.fname, 'lname': self.lname, 'dob': self.dob, 'city':
> self.city, 'state': self.state, 'zip': self.zipcode}
>
> sqlcall = """SELECT * FROM myapp.new_user( %(fname)s, %(lname)s,
> %(dob)s, %(city)s, %(state)s, %(zip)s""" % qdict
>
> curs.execute(sqlcall)
>
> --------------------------- /snip ---------------------------
> That fails because none of the strings are not quoted at all, ever.
>
> Of course, I foolishly tried going back and putting quotes around all of
> those named string formatting args, and of course that fails when you have
> something like a quoted "NULL" trying to move into a date column (dob is
> allowed to be null). It has other issues too, like being error-prone and a
> PITA, but hey, it was pre-coffee time.
>
> My next attempt looked like this:
> --------------------------- snip ---------------------------
> curs.execute("""SELECT * FROM myapp.new_user( %(fname)s, %(lname)s,
> %(dob)s, %(city)s, %(state)s, %(zip)s""", qdict)
> --------------------------- /snip ---------------------------
>
> Effectively just replacing the "%" with a "," to pass an actual param list
> instead of passing only one arg that contains a string formatting operation.
>
>
> But this winds up with unquoted strings as well.
>
> So I looked into callproc a bit, but my first attempt isn't looking too
> promising:
> --------------------------- snip ---------------------------
> # you can't pass a dict to callproc
> callproc_params = [self.fname, self.lname, self.dob, self.city, self.state,
> self.zip]
> curs.callproc('myapp.new_user', callproc_params)
> --------------------------- /snip ---------------------------
>
> The error I get is:
>
> "function myapp.new_user(unknown, unknown, unknown, unknown, unknown,
> unknown) does not exist
> HINT: No function matches the given name and argument types. You might need
> to add explicit type casts"
>
> Can anyone help me understand the right way to do this, or point me to
> documentation on how to perform this type of operation?
>
> thanks.
> brian
> --
> Brian K. Jones
> Python Magazine  http://www.pythonmagazine.com
> My Blog          http://www.protocolostomy.com
> <ATT00001..c>
>
>
>
> ------------------------------
> Confidentiality Notice: This e-mail may contain proprietary information
> some of which may be legally privileged. It is for the intended recipient(s)
> only. If you believe that it has been sent to you in error, please notify
> the sender by reply e-mail and delete the message. Any disclosure, copying,
> distribution or use of this information by someone other than the intended
> recipient(s) is prohibited and may be unlawful.
>



-- 
Brian K. Jones
Python Magazine  http://www.pythonmagazine.com
My Blog          http://www.protocolostomy.com

_______________________________________________
Psycopg mailing list
Psycopg-IAPFreCvJWPBWskQ1e/[email protected]
http://lists.initd.org/mailman/listinfo/psycopg
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.