Hi-

I'm trying to add a deferred column to a declarative class after the
class has been created (but before tables are created, obviously).
This works fine with none-deferred columns, as documented on
declarative.py:48, but deferred columns added in this way don't get
added to the table definition in SQL.

Here's how I'm adding the attribute:

Bar.deferme = deferred(Column('deferme', String(30)))

I've also tried without the column name--that fails in a different
way, but still doesn't add the column definition.

A full example demonstrating this is below. Is there any workaround
for this?

Thanks!
Scott

****

"""
example of (bug?) in adding deferred columns to a declarative class
after the
class's creation.

Foo is a normal declarative class with a deferred column. Bar is the
same class,
but with the deferred column added afterwards.
"""

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

metadata = MetaData('sqlite://')
metadata.bind.echo = True
Base = declarative_base(metadata=metadata)

class Foo(Base):
    __tablename__ = 'foos'
    id = Column(Integer(unsigned=True), primary_key=True)
    text = Column(String(20))
    deferme = deferred(Column(String(30)))

    def __init__(self, text, deferme):
        self.text = text
        self.deferme = deferme

    def __repr__(self):
        return "<Foo: id %d, text %s>" % (self.id, self.text)

class Bar(Base):
    __tablename__ = 'bars'
    id = Column(Integer(unsigned=True), primary_key=True)
    text = Column(String(20))

    def __init__(self, text, deferme):
        self.text = text
        self.deferme = deferme

    def __repr__(self):
        return "<Bar: id %d, text %s>" % (self.id, self.text)

Bar.deferme = deferred(Column('deferme', String(30)))

# This doesn't work either:
# Bar.deferme = deferred(Column(String(30)))

# populate
metadata.create_all()
sess = create_session()

foo1 = Foo('sqlalchemy', 'rocks')
foo2 = Foo('but', 'I')

bar1 = Bar('want', 'better')
bar2 = Bar('deferred', 'columns')

sess.add(foo1)
sess.add(foo2)

sess.add(bar1)
sess.add(bar2)

sess.flush()
sess.clear()

# query objects, get their addresses
print "all foos"
for f in sess.query(Foo).all():
    print f.text, f.deferme

print "all bars"
for b in sess.query(Bar).all():
    print b.text, b.deferme

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

Reply via email to