On Feb 17, 2011, at 6:37 PM, Hector Blanco wrote:

> Hello everyone!
> 
> Let's say I have a class defined like this:
> 
> class User(declarativeBase):
>       """Represents a user"""
>       __tablename__ = "users"
> 
>       _id = Column("id", Integer, primary_key=True)
>       _phone = Column("phone", String(16))
>       _userName = Column("user_name", String(50), unique=True, nullable=False)
>       _password = Column("password", String(64), nullable=False)
> 
>       _userGroupId = Column("user_group_id", Integer, 
> ForeignKey("user_groups.id"))
>       _userGroup = relationship("UserGroup", uselist=False)
> 
>       def setId(self, id):
>               """Set id"""
>               self._id = int(id)
> 
>       def getId(self):
>               """Get id"""
>               return self._id
> 
>       def setUserGroupById(self, userGroupId):
>               userGroupId = int(userGroupId)
>               if userGroupId != self.userGroupId:
>                       self.userGroup = UserGroupManager.getById(userGroupId)
> 
>       def setUserGroup(self, userGroup):
>               """Set user group"""
>               if isinstance(userGroup, UserGroup):
>                       self._userGroup = userGroup
>               else:
>                       raise TypeError("Trying to set a " + 
> str(type(userGroup)) + " as user group")
> 
>       def getUserGroup(self):
>               """Get user"""
>               return self._userGroup
> 
>       #More getters/setters
> 
>       id = sqlalchemy.orm.synonym('_id', descriptor=property(getId, setId))
>       phone = sqlalchemy.orm.synonym('_phone',
> descriptor=property(getPhone, setPhone))
>       userName = sqlalchemy.orm.synonym('_userName',
> descriptor=property(getUserName, setUserName))
>       password = sqlalchemy.orm.synonym('_password',
> descriptor=property(getPassword, setPassword))
>       userGroupId = sqlalchemy.orm.synonym('_userGroupId',
> descriptor=property(getUserGroup, setUserGroup))
>       userGroup = sqlalchemy.orm.synonym('_userGroup',
> descriptor=property(getUserGroup, setUserGroup))
> 
> I have created an utility that, given an instance gives me the names
> of the synonyms in said instance.
> 
> def getProperties(instance):
>       properties = list()
>       mapper = sqlalchemy.orm.object_mapper(instance)
>       for prop in mapper.iterate_properties:
>               if isinstance(prop, sqlalchemy.orm.properties.SynonymProperty):
>                       properties.append(prop.key)
>       return properties
> 
> That would give me ["id", "phone", "userName", "password",
> "userGroupId", "userGroup"], so I can more or less generically go
> through all said values and execute things like
> 
> for attribute in getProperties(instanceOfUser):
>     value = getattr(instanceOfUser, attribute)
> 
> Is there any way of knowing that said "value"s are ForeignKeys or
> relationships? For instance, I'd like to know that the attribute "id"
> is a regular (well... kind of regular... it's a Primary key, but it's
> not going to point to anything in another table) numeric attribute,
> but "userGroupId" is a foreign key and "userGroup" is a Relationship.
> I've been sneaking in the vars, __dict__, dir of the values returned
> by getattr, but I haven't been able to find anything suitable.


you just have to poke around and use isinstance() on the MapperProperty 
objects, and/or check for known attributes.    The choices are ColumnProperty, 
RelationshipProperty, SynonymProperty, etc.

synonyms are also superceded in 0.7.  they're not very useful compared to 
hybrids.




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

Reply via email to