Re: server side cursors update & delete,

Поиск
Список
Период
Сортировка
От Adrian Klaver
Тема Re: server side cursors update & delete,
Дата
Msg-id 56BA0A32.5090102@aklaver.com
обсуждение исходный текст
Ответ на Re: server side cursors update & delete,  (Vardhan <vrdhn0@gmail.com>)
Список psycopg
On 02/09/2016 07:34 AM, Vardhan wrote:
> On Tue, Feb 9, 2016 at 8:43 PM, Adrian Klaver <adrian.klaver@aklaver.com> wrote:
>> On 02/09/2016 01:31 AM, Vardhan wrote:
>>>
>>> Hi,
>>>
>>> The section   '39.7.3.3. UPDATE/DELETE WHERE CURRENT OF' of
>>> http://www.postgresql.org/docs/9.2/static/plpgsql-cursors.html
>>> specifies the syntax as:
>>>
>>>     UPDATE table SET ... WHERE CURRENT OF cursor;
>>>     DELETE FROM table WHERE CURRENT OF cursor;
>>>
>>> Is there a way to generate these syntax for update & delete ?
>>>
>>> Right now, if i get the error that .execute() can't be called more than
>>> once !
>>
>>
>> Have you looked at?:
>>
>> http://initd.org/psycopg/docs/usage.html#server-side-cursors
>>
>> and
>>
>> http://initd.org/psycopg/docs/connection.html#connection.cursor
>>>
>
>
> Hi Adrian,
>       I did went thru the documentation *twice*, before posting, but
> still possible that I missed sth. obvious.
>
>       Actually, the first link states something which conflicts with pg doc:
>
>   "Server side cursor are created in PostgreSQL using the DECLARE
> command and subsequently handled using MOVE, FETCH and CLOSE
> commands."
>
>     Where as, the pg doc clearly states that UPDATE & DELETE  .. where
> CURRENT OF <cursor> are also allowed.

Yeah, I was going back through the docs when you made this post.
Realized the form you wanted is not directly supported. What you want is
a variation of UPDATE/DELETE that walks through a CURSOR. I could see
replicating that by using the psycopg2 named cursor support to 'attach'
to a server-side cursor that has the WHERE condition you want and then
walking through that and then, from docs:

cur2 = conn.cursor('curname')
for record in cur2:     # or cur2.fetchone, fetchmany...
     # do something with record
     pass

where 'do something' is the UPDATE or DELETE.

>
>    I was able to achieve what i wanted with this function:
>
> def myexec (c,query,vars=None):
>      c = self.connection.cursor()
>      c.execute(query + ' WHERE CURRENT OF "' + self.name + '"',vars)
>      c.close()
>
> and call as :
>
> c = conn.cursor('c1')
> c.execute('select * from TEST;')
> c.itersize = 1
> for r in c:
>      print (r)
>      myexec(c,'update TEST set (  num )  =  ( %s )  ',(r[1]+7,))
>
>
> Now , I totally understand that this is very inefficient because of
> several round trips,
> and attempt should be made to do these kind of things with server side
> functions,
> or may be collect id's and update in one go etc.
>
>
> Thanks
> Vardhan
>
>
>>>
>>> --
>>> TIA
>>> Vardhan
>>>
>>>
>>
>>
>> --
>> Adrian Klaver
>> adrian.klaver@aklaver.com


--
Adrian Klaver
adrian.klaver@aklaver.com


В списке psycopg по дате отправления:

Предыдущее
От: "Karl O. Pinc"
Дата:
Сообщение: Re: A PGsendQuery API design for your review
Следующее
От: Serge Christian Ibala
Дата:
Сообщение: Using pgAdminIII to view the data written in PostGreSQL