On Nov 10, 2011, at 9:34 AM, Mark Erbaugh wrote:
> I'm trying to use data from a sequence to add columns to a SQLAlchemy table
> created declaratively. Here's what I'm doing:
>
> class Sizing(Base):
> __tablename__ = 'sizing'
> id = Column(Integer, primary_key=True)
>
> [...]
>
>
> for name in ('column1', 'column2', 'column3', ...):
> x = Column(type_=Integer)
> x.name = name
> Sizing.__table__.append_column(x)
that will just add the column to the table but won't map it. the mapper isn't
aware of this operation.
>
> This works as far as creating the table in the database, i.e. viewing the
> database shows columns named column1, column2, column3, etc, but code like
> getattr(sizing, 'column1') (sizing is an instance of Sizing) is failinging
> with a message "'Sizing' object has no attribute 'column1'"
>
> While code like:
>
> Sizing.colum1 = Column(Integer)
>
> works, but
right so that hits the __setattr__ of the DeclarativeMeta class which receives
the Column object, checks it out, and assigns it correctly to the mapper and
table.
>
> Sizing.__dict__['column1'] = Column(Integer)
In general, you should never set attributes this way from the outside, that's
just a Python thing, as you're bypassing whatever attribute set mechanics may
be present on the target object.
> or
>
> Sizing.__setattr__(Sizing, 'column1', Column(Integer))
this is not much different as again you're bypassing instrumentation that may
be available on the class. Use the Python setattr() function instead:
setattr(Sizing, "name", object).
--
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.