Thread: Update with function

Update with function

From
egbert
Date:
Hello,
I am new to this list, and a fairly unsophisticated user of postgresql
and psycopg.

I try to update one field in all records of a table.
The new value is too complicated for a simple expression, so I thought
about a python function. That function uses another field, recno, from
each record.
My question is: how do I pass that second field to the function.

The relevant parts of my script are now:

define makeyear(nummer):
    # ...
    return value

cur.execute("update books set inyear=%s", (makeyear(recno),))

The error message says that recno is not defined.
egbert
--
Egbert Bouwman
Keizersgracht 197-II
1016 DS  Amsterdam
Tel 0(031)20 6257991


Re: Update with function

From
Adrian Klaver
Date:
On 03/30/2012 03:58 AM, egbert wrote:
> Hello,
> I am new to this list, and a fairly unsophisticated user of postgresql
> and psycopg.
>
> I try to update one field in all records of a table.
> The new value is too complicated for a simple expression, so I thought
> about a python function. That function uses another field, recno, from
> each record.
> My question is: how do I pass that second field to the function.
>
> The relevant parts of my script are now:
>
> define makeyear(nummer):
>      # ...
>      return value
>
> cur.execute("update books set inyear=%s", (makeyear(recno),))
>
> The error message says that recno is not defined.


The parameter list you are passing lives outside the database you are
using so it has no reference to the field recno.

A simple solution that demonstrates one way to do the above:


cur.execute("select recno from some_table")

for row in cur:
    recno = cur[0]
    cur.execute("update books set inyear=%s", (makeyear(recno),))

> egbert


--
Adrian Klaver
adrian.klaver@gmail.com

Re: Update with function

From
egbert
Date:
On Fri, 2012-03-30 at 06:45 -0700, Adrian Klaver wrote:

> A simple solution that demonstrates one way to do the above:
>
>
> cur.execute("select recno from some_table")
>
> for row in cur:
>     recno = cur[0]
>     cur.execute("update books set inyear=%s", (makeyear(recno),))
>
Thanks for your suggestion, Adrian.
Actually, that was something I tried first.
But my some_table is about 165000 records, and it took nearly three
hours (on my not so young system) to run the individual updates.
So I looked for a one-pass solution.
egbert

--
Egbert Bouwman
Keizersgracht 197-II
1016 DS  Amsterdam
Tel 0(031)20 6257991


Re: Update with function

From
Adrian Klaver
Date:
On 03/30/2012 09:02 AM, egbert wrote:
> On Fri, 2012-03-30 at 06:45 -0700, Adrian Klaver wrote:
>
>> A simple solution that demonstrates one way to do the above:
>>
>>
>> cur.execute("select recno from some_table")
>>
>> for row in cur:
>>     recno = cur[0]
>>     cur.execute("update books set inyear=%s", (makeyear(recno),))
>>
> Thanks for your suggestion, Adrian.
> Actually, that was something I tried first.
> But my some_table is about 165000 records, and it took nearly three
> hours (on my not so young system) to run the individual updates.
> So I looked for a one-pass solution.

Another option is write function in Postgres that does what you want and
call that function.

> egbert
>


--
Adrian Klaver
adrian.klaver@gmail.com

Re: Update with function

From
Daniele Varrazzo
Date:
On Fri, Mar 30, 2012 at 5:05 PM, Adrian Klaver <adrian.klaver@gmail.com> wrote:
> On 03/30/2012 09:02 AM, egbert wrote:
>>
>> On Fri, 2012-03-30 at 06:45 -0700, Adrian Klaver wrote:
>>
>>> A simple solution that demonstrates one way to do the above:
>>>
>>>
>>> cur.execute("select recno from some_table")
>>>
>>> for row in cur:
>>>        recno = cur[0]
>>>        cur.execute("update books set inyear=%s", (makeyear(recno),))
>>>
>> Thanks for your suggestion, Adrian.
>> Actually, that was something I tried first.
>> But my some_table is about 165000 records, and it took nearly three
>> hours (on my not so young system) to run the individual updates.
>> So I looked for a one-pass solution.
>
>
> Another option is write function in Postgres that does what you want and
> call that function.

Which could also be implemented in Python, via pl/python.

-- Daniele

Re: Update with function

From
egbert
Date:
On Fri, 2012-03-30 at 17:07 +0100, Adrian Klaver and Daniele Varrazzo
wrote:
> > Another option is write function in Postgres that does what you want and
> > call that function.
>
> Which could also be implemented in Python, via pl/python.
>
I will install and dive into plpython. Thanks.
egbert
--
Egbert Bouwman
Keizersgracht 197-II
1016 DS  Amsterdam
Tel 0(031)20 6257991