On Jul 17, 2009, at 4:54 AM, svitek.pa...@googlemail.com wrote:

>
> Hi.
>
> I want to create a function or operator, that will convert column or
> string from utf-8 encoding to ascii.
> I'm not sure, how function / operators work in SA. So let's start from
> the beginnig:
> 1) using postgresql 8.3, sqlalchemy 0.5.3
>
> 2) had created function in pgsql:
> CREATE FUNCTION to_ascii(bytea, name)
> RETURNS text AS 'to_ascii_encname' LANGUAGE internal RETURNS NULL ON
> NULL INPUT;
>
> 3) converting from utf-8 to ascii:
> to_ascii(convert_to('čačašaša','latin2'), 'latin2')
> result: cacasasa
>
> 4) using it like this:
> ... WHERE to_ascii(convert_to(<column_name>,'latin2'), 'latin2') ILIKE
> to_ascii(convert_to(<non_ascii_str>,'latin2'), 'latin2')
>
> 5) my vision is to use it like this:
> session
> .query(Client).filter( ascii(Client.name).ilike(ascii(name)).all
> ()
> or
> session.query(Client).filter( ascii(Client.name).ascii_ilike(name).all
> ()
> or something other :)

if you can make just a single "ascii()" stored procedure, then you can  
say:

query(Client).filter(func.ascii("foo") == "bar")

or you can combine those

def ascii(arg):
    return func.to_ascii(func.convert_to(arg, "latin2"))

otherwise you can use ext.compiler:

from sqlalchemy.sql.expression import Function
from sqlalchemy.ext.compiler import compiles

class ascii_op(Function):
    def __init__(self, val, enc='latin2'):
         self.val = val
         self.enc = enc

@compiles(ascii_op)
def compile_ascii_op(element, compiler, **kw):
       return "to_ascii(convert_to(%(val)s,'%(enc)s'), '%(enc)s')" %  
element.__dict__



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to