Обсуждение: OT? plpython2u

Поиск
Список
Период
Сортировка

OT? plpython2u

От
Nahum Castro
Дата:
Hello all.

I need to process images on my database, they are stored on a bytea column.

The process consist on scaling and I have done this so far:

CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
RETURNS bytea AS
$$
    import PIL
    from PIL import Image
    basewidth = 300
    img = randstring
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
   
    return img
$$
  LANGUAGE 'plpython2u' VOLATILE;


The objective of this pl is read the bytea from the database, scale, then replace the scaled image in the database, but I don't know  what type use to pass to the variable img.

This is the query.
update personal set foto=ajustar(encode(foto, 'hex')::bytea);

Thanks in advance.
Nahum





--
Nahum Castro González
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694

Re: OT? plpython2u

От
Jonathan Rogers
Дата:
On 10/20/2016 01:14 PM, Nahum Castro wrote:
> Hello all.
>
> I need to process images on my database, they are stored on a bytea column.
>
> The process consist on scaling and I have done this so far:
>
> CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
> RETURNS bytea AS
> $$
>     import PIL
>     from PIL import Image
>     basewidth = 300
>     img = randstring
>     wpercent = (basewidth/float(img.size[0]))
>     hsize = int((float(img.size[1])*float(wpercent)))
>     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>
>     return img
> $$
>   LANGUAGE 'plpython2u' VOLATILE;

As you probably know, Postgres procedural languages are server-side
extensions and therefore have nothing to do with psycopg, which is a
client-side library.

>
> The objective of this pl is read the bytea from the database, scale,
> then replace the scaled image in the database, but I don't know  what
> type use to pass to the variable img.

AFAICT, if you pass a bytea value to a plpythonu function, it will
receive a Python str object.

>
> This is the query.
> update personal set foto=ajustar(encode(foto, 'hex')::bytea);

Why are you encoding the binary data into a textual representation? What
image format is stored in column "foto"? Depending on the format, you
probably want to use one of these constructors in function "ajustar":

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open

--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com

--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com


Re: OT? plpython2u

От
Nahum Castro
Дата:


2016-10-20 13:06 GMT-05:00 Jonathan Rogers <jrogers@socialserve.com>:
On 10/20/2016 01:14 PM, Nahum Castro wrote:
> Hello all.
>
> I need to process images on my database, they are stored on a bytea column.
>
> The process consist on scaling and I have done this so far:
>
> CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
> RETURNS bytea AS
> $$
>     import PIL
>     from PIL import Image
>     basewidth = 300
>     img = randstring
>     wpercent = (basewidth/float(img.size[0]))
>     hsize = int((float(img.size[1])*float(wpercent)))
>     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>
>     return img
> $$
>   LANGUAGE 'plpython2u' VOLATILE;

As you probably know, Postgres procedural languages are server-side
extensions and therefore have nothing to do with psycopg, which is a
client-side library.
​Thanks, but rather than help in plpython is how to pass the variable bytea from postgres to an image in python.

>
> The objective of this pl is read the bytea from the database, scale,
> then replace the scaled image in the database, but I don't know  what
> type use to pass to the variable img.

AFAICT, if you pass a bytea value to a plpythonu function, it will
receive a Python str object.

​That is where i get confused, what is stored in the db is in bytea, how I do to transform in a str?​

 

>
> This is the query.
> update personal set foto=ajustar(encode(foto, 'hex')::bytea);

Why are you encoding the binary data into a textual representation? What
image format is stored in column "foto"? Depending on the format, you
probably want to use one of these constructors in function "ajustar":

​Sorry I forgot, all images are in jpeg​ format.
 

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open

​Again thanks.​
Nahum


--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com

--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com


--
Sent via psycopg mailing list (psycopg@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/psycopg



--
Nahum Castro González
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694

Re: OT? plpython2u

От
Adrian Klaver
Дата:
On 10/20/2016 12:03 PM, Nahum Castro wrote:
>
>
> 2016-10-20 13:06 GMT-05:00 Jonathan Rogers <jrogers@socialserve.com
> <mailto:jrogers@socialserve.com>>:
>
>     On 10/20/2016 01:14 PM, Nahum Castro wrote:
>     > Hello all.
>     >
>     > I need to process images on my database, they are stored on a bytea column.
>     >
>     > The process consist on scaling and I have done this so far:
>     >
>     > CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
>     > RETURNS bytea AS
>     > $$
>     >     import PIL
>     >     from PIL import Image
>     >     basewidth = 300
>     >     img = randstring
>     >     wpercent = (basewidth/float(img.size[0]))
>     >     hsize = int((float(img.size[1])*float(wpercent)))
>     >     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>     >
>     >     return img
>     > $$
>     >   LANGUAGE 'plpython2u' VOLATILE;
>
>     As you probably know, Postgres procedural languages are server-side
>     extensions and therefore have nothing to do with psycopg, which is a
>     client-side library.
>
> ​Thanks, but rather than help in plpython is how to pass the variable
> bytea from postgres to an image in python.
>
>
>     >
>     > The objective of this pl is read the bytea from the database, scale,
>     > then replace the scaled image in the database, but I don't know  what
>     > type use to pass to the variable img.
>
>     AFAICT, if you pass a bytea value to a plpythonu function, it will
>     receive a Python str object.
>
>
> ​That is where i get confused, what is stored in the db is in bytea, how
> I do to transform in a str?​

It is done for you:

https://www.postgresql.org/docs/9.5/static/plpython-data.html#AEN65498

"PostgreSQL bytea is converted to Python str in Python 2 and to bytes in
Python 3. In Python 2, the string should be treated as a byte sequence
without any character encoding.

When the PostgreSQL return type is bytea, the return value will be
converted to a string (Python 2) or bytes (Python 3) using the
respective Python built-ins, with the result being converted to bytea."


So something like this:

CREATE OR REPLACE FUNCTION public.ajustar(randstring bytea)
  RETURNS bytea
  LANGUAGE plpythonu
AS $function$
     from io import BytesIO
     import PIL
     from PIL import Image
     basewidth = 300
     mem_file = BytesIO()
     mem_file.write(randstring)
     img = Image.open(mem_file)
     wpercent = (basewidth/float(img.size[0]))
     hsize = int((float(img.size[1])*float(wpercent)))
     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)

     return img
$function$


postgres@test=# select ajustar(barcode) from pict_test where full_upc =
'744835000544';
                                                              ajustar


----------------------------------------------------------------------------------------------------------------------------------


\x3c50494c2e496d6167652e496d61676520696d616765206d6f64653d5247422073697a653d333030783230392061742030783746393343314532333635303e
(1 row)


barcode are small png's in this case.

>
>
>
>
>     >
>     > This is the query.
>     > update personal set foto=ajustar(encode(foto, 'hex')::bytea);
>
>     Why are you encoding the binary data into a textual representation? What
>     image format is stored in column "foto"? Depending on the format, you
>     probably want to use one of these constructors in function "ajustar":
>
>
> ​Sorry I forgot, all images are in jpeg​ format.
>
>
>
>     http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring
>     <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring>
>
>     http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open
>     <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open>
>
>
> ​Again thanks.​
> Nahum
>
>
>
>     --
>     Jonathan Rogers
>     Socialserve.com by Emphasys Software
>     jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com>
>
>     --
>     Jonathan Rogers
>     Socialserve.com by Emphasys Software
>     jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com>
>
>
>     --
>     Sent via psycopg mailing list (psycopg@postgresql.org
>     <mailto:psycopg@postgresql.org>)
>     To make changes to your subscription:
>     http://www.postgresql.org/mailpref/psycopg
>     <http://www.postgresql.org/mailpref/psycopg>
>
>
>
>
> --
> *Nahum Castro González*
> Blvd. Perdigón 214, Brisas del Lago.
> CP 37207
> León, Guanajuato, México
> Tel (477)1950304
> Cel (477)1274694


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: OT? plpython2u

От
Nahum Castro
Дата:
Oh, Awesome.

Thanks a lot.

Nahum.

2016-10-20 14:47 GMT-05:00 Adrian Klaver <adrian.klaver@aklaver.com>:
On 10/20/2016 12:03 PM, Nahum Castro wrote:


2016-10-20 13:06 GMT-05:00 Jonathan Rogers <jrogers@socialserve.com
<mailto:jrogers@socialserve.com>>:


    On 10/20/2016 01:14 PM, Nahum Castro wrote:
    > Hello all.
    >
    > I need to process images on my database, they are stored on a bytea column.
    >
    > The process consist on scaling and I have done this so far:
    >
    > CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
    > RETURNS bytea AS
    > $$
    >     import PIL
    >     from PIL import Image
    >     basewidth = 300
    >     img = randstring
    >     wpercent = (basewidth/float(img.size[0]))
    >     hsize = int((float(img.size[1])*float(wpercent)))
    >     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
    >
    >     return img
    > $$
    >   LANGUAGE 'plpython2u' VOLATILE;

    As you probably know, Postgres procedural languages are server-side
    extensions and therefore have nothing to do with psycopg, which is a
    client-side library.

​Thanks, but rather than help in plpython is how to pass the variable
bytea from postgres to an image in python.


    >
    > The objective of this pl is read the bytea from the database, scale,
    > then replace the scaled image in the database, but I don't know  what
    > type use to pass to the variable img.

    AFAICT, if you pass a bytea value to a plpythonu function, it will
    receive a Python str object.


​That is where i get confused, what is stored in the db is in bytea, how
I do to transform in a str?​

It is done for you:

https://www.postgresql.org/docs/9.5/static/plpython-data.html#AEN65498

"PostgreSQL bytea is converted to Python str in Python 2 and to bytes in Python 3. In Python 2, the string should be treated as a byte sequence without any character encoding.

When the PostgreSQL return type is bytea, the return value will be converted to a string (Python 2) or bytes (Python 3) using the respective Python built-ins, with the result being converted to bytea."


So something like this:

CREATE OR REPLACE FUNCTION public.ajustar(randstring bytea)
 RETURNS bytea
 LANGUAGE plpythonu
AS $function$
    from io import BytesIO
    import PIL
    from PIL import Image
    basewidth = 300
    mem_file = BytesIO()
    mem_file.write(randstring)
    img = Image.open(mem_file)
    wpercent = (basewidth/float(img.size[0]))
    hsize = int((float(img.size[1])*float(wpercent)))
    img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)

    return img
$function$


postgres@test=# select ajustar(barcode) from pict_test where full_upc = '744835000544';
                                                             ajustar
----------------------------------------------------------------------------------------------------------------------------------

\x3c50494c2e496d6167652e496d61676520696d616765206d6f64653d5247422073697a653d333030783230392061742030783746393343314532333635303e
(1 row)


barcode are small png's in this case.





    >
    > This is the query.
    > update personal set foto=ajustar(encode(foto, 'hex')::bytea);

    Why are you encoding the binary data into a textual representation? What
    image format is stored in column "foto"? Depending on the format, you
    probably want to use one of these constructors in function "ajustar":


​Sorry I forgot, all images are in jpeg​ format.



    http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring
    <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring>

    http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open
    <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open>


​Again thanks.​
Nahum



    --
    Jonathan Rogers
    Socialserve.com by Emphasys Software
    jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com>

    --
    Jonathan Rogers
    Socialserve.com by Emphasys Software
    jrogers@emphasys-software.com <mailto:jrogers@emphasys-software.com>


    --
    Sent via psycopg mailing list (psycopg@postgresql.org
    <mailto:psycopg@postgresql.org>)
    To make changes to your subscription:
    http://www.postgresql.org/mailpref/psycopg
    <http://www.postgresql.org/mailpref/psycopg>




--
*Nahum Castro González*
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694


--
Adrian Klaver
adrian.klaver@aklaver.com



--
Nahum Castro González
Blvd. Perdigón 214, Brisas del Lago.
CP 37207
León, Guanajuato, México
Tel (477)1950304
Cel (477)1274694

Re: OT? plpython2u

От
Adrian Klaver
Дата:
On 10/20/2016 12:52 PM, Nahum Castro wrote:
> Oh, Awesome.
>
> Thanks a lot.

FYI, I forgot to close the mem_file in the example I sent.

>
> Nahum.
>
> 2016-10-20 14:47 GMT-05:00 Adrian Klaver <adrian.klaver@aklaver.com
> <mailto:adrian.klaver@aklaver.com>>:
>
>     On 10/20/2016 12:03 PM, Nahum Castro wrote:
>
>
>
>         2016-10-20 13:06 GMT-05:00 Jonathan Rogers
>         <jrogers@socialserve.com <mailto:jrogers@socialserve.com>
>         <mailto:jrogers@socialserve.com <mailto:jrogers@socialserve.com>>>:
>
>
>             On 10/20/2016 01:14 PM, Nahum Castro wrote:
>             > Hello all.
>             >
>             > I need to process images on my database, they are stored
>         on a bytea column.
>             >
>             > The process consist on scaling and I have done this so far:
>             >
>             > CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
>             > RETURNS bytea AS
>             > $$
>             >     import PIL
>             >     from PIL import Image
>             >     basewidth = 300
>             >     img = randstring
>             >     wpercent = (basewidth/float(img.size[0]))
>             >     hsize = int((float(img.size[1])*float(wpercent)))
>             >     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>             >
>             >     return img
>             > $$
>             >   LANGUAGE 'plpython2u' VOLATILE;
>
>             As you probably know, Postgres procedural languages are
>         server-side
>             extensions and therefore have nothing to do with psycopg,
>         which is a
>             client-side library.
>
>         ​Thanks, but rather than help in plpython is how to pass the
>         variable
>         bytea from postgres to an image in python.
>
>
>             >
>             > The objective of this pl is read the bytea from the
>         database, scale,
>             > then replace the scaled image in the database, but I don't
>         know  what
>             > type use to pass to the variable img.
>
>             AFAICT, if you pass a bytea value to a plpythonu function,
>         it will
>             receive a Python str object.
>
>
>         ​That is where i get confused, what is stored in the db is in
>         bytea, how
>         I do to transform in a str?​
>
>
>     It is done for you:
>
>     https://www.postgresql.org/docs/9.5/static/plpython-data.html#AEN65498
>     <https://www.postgresql.org/docs/9.5/static/plpython-data.html#AEN65498>
>
>     "PostgreSQL bytea is converted to Python str in Python 2 and to
>     bytes in Python 3. In Python 2, the string should be treated as a
>     byte sequence without any character encoding.
>
>     When the PostgreSQL return type is bytea, the return value will be
>     converted to a string (Python 2) or bytes (Python 3) using the
>     respective Python built-ins, with the result being converted to bytea."
>
>
>     So something like this:
>
>     CREATE OR REPLACE FUNCTION public.ajustar(randstring bytea)
>      RETURNS bytea
>      LANGUAGE plpythonu
>     AS $function$
>         from io import BytesIO
>         import PIL
>         from PIL import Image
>         basewidth = 300
>         mem_file = BytesIO()
>         mem_file.write(randstring)
>         img = Image.open(mem_file)
>         wpercent = (basewidth/float(img.size[0]))
>         hsize = int((float(img.size[1])*float(wpercent)))
>         img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>
>         return img
>     $function$
>
>
>     postgres@test=# select ajustar(barcode) from pict_test where
>     full_upc = '744835000544';
>                                                                  ajustar
>
----------------------------------------------------------------------------------------------------------------------------------
>
>
\x3c50494c2e496d6167652e496d61676520696d616765206d6f64653d5247422073697a653d333030783230392061742030783746393343314532333635303e
>     (1 row)
>
>
>     barcode are small png's in this case.
>
>
>
>
>
>             >
>             > This is the query.
>             > update personal set foto=ajustar(encode(foto, 'hex')::bytea);
>
>             Why are you encoding the binary data into a textual
>         representation? What
>             image format is stored in column "foto"? Depending on the
>         format, you
>             probably want to use one of these constructors in function
>         "ajustar":
>
>
>         ​Sorry I forgot, all images are in jpeg​ format.
>
>
>
>
>         http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring>
>
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring>>
>
>
>         http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open>
>
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open
>         <http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open>>
>
>
>         ​Again thanks.​
>         Nahum
>
>
>
>             --
>             Jonathan Rogers
>             Socialserve.com by Emphasys Software
>             jrogers@emphasys-software.com
>         <mailto:jrogers@emphasys-software.com>
>         <mailto:jrogers@emphasys-software.com
>         <mailto:jrogers@emphasys-software.com>>
>
>             --
>             Jonathan Rogers
>             Socialserve.com by Emphasys Software
>             jrogers@emphasys-software.com
>         <mailto:jrogers@emphasys-software.com>
>         <mailto:jrogers@emphasys-software.com
>         <mailto:jrogers@emphasys-software.com>>
>
>
>             --
>             Sent via psycopg mailing list (psycopg@postgresql.org
>         <mailto:psycopg@postgresql.org>
>             <mailto:psycopg@postgresql.org <mailto:psycopg@postgresql.org>>)
>             To make changes to your subscription:
>             http://www.postgresql.org/mailpref/psycopg
>         <http://www.postgresql.org/mailpref/psycopg>
>             <http://www.postgresql.org/mailpref/psycopg
>         <http://www.postgresql.org/mailpref/psycopg>>
>
>
>
>
>         --
>         *Nahum Castro González*
>         Blvd. Perdigón 214, Brisas del Lago.
>         CP 37207
>         León, Guanajuato, México
>         Tel (477)1950304
>         Cel (477)1274694
>
>
>
>     --
>     Adrian Klaver
>     adrian.klaver@aklaver.com <mailto:adrian.klaver@aklaver.com>
>
>
>
>
> --
> *Nahum Castro González*
> Blvd. Perdigón 214, Brisas del Lago.
> CP 37207
> León, Guanajuato, México
> Tel (477)1950304
> Cel (477)1274694


--
Adrian Klaver
adrian.klaver@aklaver.com


Re: OT? plpython2u

От
Jonathan Rogers
Дата:
On 10/20/2016 01:14 PM, Nahum Castro wrote:
> Hello all.
>
> I need to process images on my database, they are stored on a bytea column.
>
> The process consist on scaling and I have done this so far:
>
> CREATE OR REPLACE FUNCTION  ajustar(randstring bytea)
> RETURNS bytea AS
> $$
>     import PIL
>     from PIL import Image
>     basewidth = 300
>     img = randstring
>     wpercent = (basewidth/float(img.size[0]))
>     hsize = int((float(img.size[1])*float(wpercent)))
>     img = img.resize((basewidth,hsize), PIL.Image.ANTIALIAS)
>
>     return img
> $$
>   LANGUAGE 'plpython2u' VOLATILE;

As you probably know, Postgres procedural languages are server-side
extensions and therefore have nothing to do with psycopg, which is a
client-side library.

>
> The objective of this pl is read the bytea from the database, scale,
> then replace the scaled image in the database, but I don't know  what
> type use to pass to the variable img.

AFAICT, if you pass a bytea value to a plpythonu function, it will
receive a Python str object.

>
> This is the query.
> update personal set foto=ajustar(encode(foto, 'hex')::bytea);

Why are you encoding the binary data into a textual representation? What
image format is stored in column "foto"? Depending on the format, you
probably want to use one of these constructors in function "ajustar":

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.fromstring

http://pillow.readthedocs.io/en/3.4.x/reference/Image.html?highlight=Image#PIL.Image.open

--
Jonathan Rogers
Socialserve.com by Emphasys Software
jrogers@emphasys-software.com