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 [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
-~----------~----~----~----~------~----~------~--~---