🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.python
5 messages
5 total messages Started by janosikowy Thu, 11 Feb 2010 01:07
sqlalchemy - property
#27294
Author: janosikowy
Date: Thu, 11 Feb 2010 01:07
30 lines
1908 bytes
hej,
mam następujący problem z sqlalchemy (0.5.6) - działam na windows.
definiuję klasę mniej więcej tak:

class Account(Base):
    __tablename__ = 'accounts'
    id = Column( Integer, primary_key=True )
    _name = Column('name', String(length=255), nullable=False )

    def get_name(self):
        return self._name.lower().strip()
    def set_name(self, value):
        self._name = value.lower().strip()

name = synonym('_name', descriptor=property(get_name, set_name)) 

Niestety nie wiem co robię nie tak, ponieważ synonimy nie działają w
zapytaniach (filter, distinct nie widzi strip() i lower() ).
przykładowo:
Session.query(User.name).distinct()
zwraca mi dokładnie to co jest w bazie, bez potraktowania danych stripem i
lower. Z filter jest analogicznie, czyli dane z bazy nie są podmieniane przez
moje 'gettery'.
Acha, sprawdzałem też opcję map_column=True dla synonym() - bez zmian.
Proszę o naprowadzenie na trop co robię nie tak.

pozdrawiam

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: sqlalchemy - property
#27295
Author: Piotr Husiatynski
Date: Thu, 11 Feb 2010 05:40
32 lines
2070 bytes
Dnia 11.02.2010  janosikowy <janosikowy@gazeta.SKASUJ-TO.pl> napisał/a:
> hej,
> mam następujący problem z sqlalchemy (0.5.6) - działam na windows.
> definiuję klasę mniej więcej tak:
>
> class Account(Base):
>     __tablename__ = 'accounts'
>     id = Column( Integer, primary_key=True )
>     _name = Column('name', String(length=255), nullable=False )
>
>     def get_name(self):
>         return self._name.lower().strip()
>     def set_name(self, value):
>         self._name = value.lower().strip()
>
> name = synonym('_name', descriptor=property(get_name, set_name)) 
>
> Niestety nie wiem co robię nie tak, ponieważ synonimy nie działają w
> zapytaniach (filter, distinct nie widzi strip() i lower() ).
> przykładowo:
> Session.query(User.name).distinct()
> zwraca mi dokładnie to co jest w bazie, bez potraktowania danych stripem i
> lower. Z filter jest analogicznie, czyli dane z bazy nie są podmieniane przez
> moje 'gettery'.
> Acha, sprawdzałem też opcję map_column=True dla synonym() - bez zmian.
> Proszę o naprowadzenie na trop co robię nie tak.

`User` to klasa? Bo wyżej napisałeś `Account`. Jeśli to to samo, to zauważ, że
`User` jest obiektem typu klasa (nie jej instancją).

-- 
Piotr Husiatyński
Re: sqlalchemy - property
#27296
Author: janosikowy
Date: Thu, 11 Feb 2010 11:42
26 lines
2014 bytes
Piotr Husiatynski <husio@gmail.com> napisał(a): 

> 
> `User` to klasa? Bo wyżej napisałeś `Account`. Jeśli to to samo, to zauważ
> , że
> `User` jest obiektem typu klasa (nie jej instancją).
> 
Kod jest przykładowy, pisany na żywca i oczywiście się walnąłem ;)
Poprawne prawidłowe zapytania:
Session.query(Account.name).distinct() 
Session.query(Account).filter(Account.name=='j.kowalski')

Niestety deskryptory nadal nie działają tak jak to sobie wyobrażałem.
Trochę się zagłębiam w dokumentację i jestem lekko zagubiony.
Niby jest mowa o 'custom comparatorach', co chyba rozwiąże mój problem,
jednak cytując dokumentację:
http://www.sqlalchemy.org/docs/05/mappers.html#using-descriptors
"The email attribute is now usable in the same way as any other mapped
attribute, including filter expressions, get/set operations, etc.:"

Getter/Setter działa tak jak przewidywałem.
W Query descriptor zwraca mi zawsze wartość z bazy, atrbuty nie podlegają
modyfikacji getterem.

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: sqlalchemy - property
#27297
Author: janosikowy
Date: Thu, 11 Feb 2010 13:09
32 lines
2065 bytes
Piotr Husiatynski <husio@gmail.com> napisał(a): 

> 
> `User` to klasa? Bo wyżej napisałeś `Account`. Jeśli to to samo, to zauważ
> , że
> `User` jest obiektem typu klasa (nie jej instancją).
> 
Kod jest przykładowy, pisany na żywca i oczywiście się walnąłem ;)
Poprawne prawidłowe zapytania:
Session.query(Account.name).distinct() 
Session.query(Account).filter(Account.name=='j.kowalski')

Niestety deskryptory nadal nie działają tak jak to sobie wyobrażałem.
Trochę się zagłębiam w dokumentację i jestem lekko zagubiony.
Niby jest mowa o 'custom comparatorach', co chyba rozwiąże mój problem,
jednak cytując dokumentację:
http://www.sqlalchemy.org/docs/05/mappers.html#using-descriptors
"The email attribute is now usable in the same way as any other mapped
attribute, including filter expressions, get/set operations, etc.:"

Getter/Setter działa tak jak przewidywałem.
W Query descriptor zwraca mi zawsze wartość z bazy, atrybuty nie podlegają
modyfikacji getterem.

reasumując:
czy definiując w podany sposób własne gettery i settery popełniam błąd,
czy też muszę użyć własnego comparatora?

pozdrawiam.

-- 
Wysłano z serwisu Usenet w portalu Gazeta.pl -> http://www.gazeta.pl/usenet/
Re: sqlalchemy - property
#27298
Author: Piotr Husiatynski
Date: Thu, 11 Feb 2010 13:42
37 lines
2593 bytes
Dnia 11.02.2010   <janosikowy@WYTNIJ.gazeta.pl> napisał/a:
> Piotr Husiatynski <husio@gmail.com> napisał(a): 
>
>> 
>> `User` to klasa? Bo wyżej napisałeś `Account`. Jeśli to to samo, to zauważ
>> , że
>> `User` jest obiektem typu klasa (nie jej instancją).
>> 
> Kod jest przykładowy, pisany na żywca i oczywiście się walnąłem ;)
> Poprawne prawidłowe zapytania:
> Session.query(Account.name).distinct() 
> Session.query(Account).filter(Account.name=='j.kowalski')
>
> Niestety deskryptory nadal nie działają tak jak to sobie wyobrażałem.
> Trochę się zagłębiam w dokumentację i jestem lekko zagubiony.
> Niby jest mowa o 'custom comparatorach', co chyba rozwiąże mój problem,
> jednak cytując dokumentację:
> http://www.sqlalchemy.org/docs/05/mappers.html#using-descriptors
> "The email attribute is now usable in the same way as any other mapped
> attribute, including filter expressions, get/set operations, etc.:"
>
> Getter/Setter działa tak jak przewidywałem.
> W Query descriptor zwraca mi zawsze wartość z bazy, atrybuty nie podlegają
> modyfikacji getterem.
>
> reasumując:
> czy definiując w podany sposób własne gettery i settery popełniam błąd,
> czy też muszę użyć własnego comparatora?

Nie znam za dobrze slqalchemy, ale jeśli pola klasy pythonowej są mapowane na
kolumny w bazie (a pewnie są), to jakiekolwiek działania na bazie przy użyciu
nieistniejących kolumn są bez sensu.
Nie wydaje mi się, żeby sqlalchemy było na tyle "inteligentne", żeby zajrzeć do
stworzonych property i wnioskować o co chodzi. 

-- 
Piotr Husiatyński
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads