Hi,
I am looking to retrieving the pure python class that participates in a
mapping. I would like to do this **after** the mapping took place and
modified/extended the class' attributes.
For instance, with this code
class Thing(object):
def __init__(self, id=None, name=None):
self.id = id
self.name = name
def do_something(): pass
things = Table(
"things",
metadata,
Column("id", Integer, primary_key=True),
Column("name", String)
)
mapper(Thing, things)
After the mapper is called, it looks like the original class is modified
beyond repair. By this I mean it is no longer possible to consider it a
pure class that can be used for OO tasks, such as inheriting from it to
inherit behavior. Instead, a table is now directly associated with it and
inheriting from it will either cause problems or create a 2nd table, and
will bring all the sql alchemy baggage with it (validators, relationships,
etc.)
I would like to access the pure 'Thing" class as it stands before the call
to mapper(). The use-case is basically that I want to inherit behavior of
the ORM class, but behavior only. I possibly want to map the inherited
subclass to a *different* table.
I know that this can be done this way, which also describes my use-case
class _Thing(object):
id = Column(Integer, primary_key=True)
name = Column(String)
def do_something(): pass
class Thing(_Thing, Base):
__tablename__ = "things"
class ThingCopy(_Thing, Base):
__tablename__ = "thing_copies"
# twist!
original_thing_id = Column(Integer, ForeignKey(Thing.id))
original_thing = relationship(Thing)
So I have "copies" of my original items that reside in different tables,
but they 1) share all behavior and 2) share a copy of *almost* all sql
alchemy descriptors/behavior. Now the example above may look cute, but in
reality if we are talking large classes with relationships, the
@declared_attrs that have to go into the superclass there quickly turn the
code into an atrocity. In addition, I want to add these "copies" to all my
existing code without 1) having to refactor all if it and 2) having to
teach all co-workers how not to do things the declarative base way.
Ideally, something like this
class Thing(Base):
#regular declarative business...
__tablename__ = "things"
id = Column(Integer, primary_key=True)
name = Column(String)
def do_something(): pass
#later, I extend the code with this unintrusive addition
class ThingCopy(Thing._pure_class): #you get the idea
__tablename__ = "thing_copies"
original_thing_id = Column(Integer, ForeignKey(Thing.id))
original_thing = relationship(Thing)
Having to split all my ORM classes into "behavior" and "mapping" logic
results in fragmented code, when it looks like it should belongs together.
I've also seen this recipe
https://bitbucket.org/zzzeek/sqlalchemy/wiki/UsageRecipes/EntityName, which
I think is even worse in that regard.
Could this be supported?
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.