Skip to content

Instantly share code, notes, and snippets.

@storborg
Created April 15, 2009 20:53
Show Gist options
  • Select an option

  • Save storborg/96017 to your computer and use it in GitHub Desktop.

Select an option

Save storborg/96017 to your computer and use it in GitHub Desktop.
"""
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment