On May 1, 2013, at 2:04 PM, Michael Nachtigal 
<[email protected]> wrote:

> On Wednesday, May 1, 2013 1:08:41 PM UTC-4, Michael Bayer wrote:
> 
> On May 1, 2013, at 12:58 PM, Michael Nachtigal 
> <[email protected]> wrote: 
> 
> > Hello, everyone, 
> > 
> > I have an existing database, and I'm trying to use reflection to populate 
> > my metadata from an existing DB, but then define a declarative class (based 
> > on one of the tables in the db), but a class with custom "renamed" mapped 
> > attributes. 
> > See the code below for what I have now (which "works"), but is there a 
> > better way to do what I'm trying to do using sqlalchemy? 
> > 
> > my_engine = create_engine(...) 
> > my_metadata = MetaData(bind=my_engine) 
> > Base = declarative_base(bind=my_engine, metadata=my_metadata) 
> > my_metadata.reflect() 
> > 
> > class User(Base): 
> > __tablename__ = 'user_table' 
> > 
> > # is there a way to access the User member variables here to rename them? 
> > # I can't seem to access __table__ here to get at the mapped columns 
> > 
> > # at this point, the User class does have all of the necessary mapped field 
> > names, but I want to rename them 
> > User.name = User.user_name 
> > User.location = User.address 
> > # ... and so on ... 
> > 
> > Feel free to ask for clarification or correct my choice of words, and many 
> > thanks in advance for your time and reply! 
> 
> I'm not sure how that works exactly because __tablename__ will cause it to 
> produce a new Table object, attempting to replace the existing one in 
> my_metadata, and you'll get an error. 
> 
> Specifying a declared class from an existing table should use __table__ (see 
> http://docs.sqlalchemy.org/en/rel_0_8/orm/extensions/declarative.html#using-reflection-with-declarative).
>    You can then map alternate names referring to that table object: 
> 
> user_table = my_metadata.tables['user_table'] 
> 
> class User(Base): 
>     __table__ = user_table 
> 
>     name = user_table.c.user_name 
>     location = user_table.c.address 
> 
> 
> Thank you for the quick reply! I double checked, and my original code does 
> work, although I'm not sure how to tell if it works indistinguishably from 
> your solution.
> 
> Follow-up question: In code like the following, is there any danger of 
> multiply binding to my_engine and/or my_metadata?
> 
> my_engine = create_engine(...)
> my_metadata = MetaData(bind=my_engine)
> Base = declarative_base(bind=my_engine, metadata=my_metadata)

The above will just bind my_metadata to my_engine twice, but it's not any 
different from assigning to "bind" twice.    I don't use bound metadata myself 
and have been trying for years to get people to kick the habit, but if it works 
for you without confusion there's no problem with it.



> 
> 
> -- 
> 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?hl=en.
> For more options, visit https://groups.google.com/groups/opt_out.
>  
>  

-- 
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?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to