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.