On Aug 5, 2011, at 1:36 PM, Mark Erbaugh wrote:
> In my application, some tables have several fields that need to have the same
> type and default value, i.e.:
>
> field1 = Column(Integer, default=2)
> field2 = Column(Integer, default=2)
> ...
>
> Is there some way to refactor the Common(Integer, default=2), short of
> creating a custom column type? I could see the possibility that in a future
> version of the application, I would want to globally change the column type
> or default value for all these fields at once.
>
> So far, I've come up with creating a function that returns the column.
>
> def common_field():
> return Column(Integer, default=2)
>
> field1 = common_field()
> field2 = common_field()
>
> Is there a better way?
What's the issue with using a function to generate a Column of a certain
pre-determined configuration (what are functions in a procedural language for
if not this) ?
FTR I use functions to generate prefab Column objects all the time and they are
also intrinsic to the example application I've created for the SQLAlchemy book
project (which is on a somewhat indefinite schedule at the moment, unless
someone wants to help write) .
If the issue is that these tables need to have a certain series of completely
fixed columns, i.e. same names and everything, here are a series of approaches
for that depending on what you're doing.
1. Regular declarative ? Use declarative mixins.
class MyMixin(object):
updated_at = Column(DateTime, onupdate=datetime.utcnow)
2. if I am using Table metadata directly (i.e. with declarative, __table__ =
Table(....)), I'd typically use a function around Table:
def standard_table(*args, **kw):
return Table(*(args + [_standard_table_cols()]), **kw)
3. For all tables, use events:
@event.listens_for(Table, "after_parent_attach")
def _table_standard_cols(table, metadata):
table.append_column(Column(DateTime, onupdate=datetime.utcnow))
4. Certain classes of tables...there's probably a nice way to combine the table
events with a subset of table classes. (tries...success !)
from sqlalchemy import *
from sqlalchemy import event
from sqlalchemy.schema import CreateTable
import datetime
class TableWithUTC(Table):
pass
@event.listens_for(TableWithUTC, "after_parent_attach")
def _add_col(table, metadata):
table.append_column(Column('updated_at', DateTime,
onupdate=datetime.datetime.utcnow))
m = MetaData()
t1 = Table('t1', m, Column('x', Integer))
t2 = TableWithUTC('t2', m, Column('x', Integer))
t3 = TableWithUTC('t3', m, Column('x', Integer))
t4 = Table('t4', m, Column('x', Integer))
assert t2.c.updated_at is not None
assert 'updated_at' not in t4.c
for name in 't1', 't2', 't3', 't4':
print CreateTable(m.tables[name])
--
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.