On Aug 5, 2011, at 3:51 PM, Michael Bayer wrote:
> 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) ?
No issue at all. I just wanted to make sure I was doing it 'the right way'. I
just noticed that in several places, SA will let you pass in a class or an
instance of a class and figures out what to do with it. I thought that
something like that might be working here.
Actually, there is a small issue with using a function: Where should the
function live? Obviously for some schema, this field type is used in multiple
tables and belongs in a global namespace, but for others (as in my
application), the field type is unique to an individual table. It would be nice
if the function could live in the class's namespace.
This is more of a Python issue than a SA issue, but I had trouble getting this
to work. I did, but the code seems a little awkard to me <sigh>. In addition
to the requirements already, I also wanted toe default value to be a class
level 'constant'. The problem, as I see it, is that since the class definition
isn't complete, it's namespace isn't avaialble. Since the default value
'constant' is a class data member, it would make sense if the function were a
@classmethod, but I couldn't get python to accept:
class Table(Base):
...
DEFAULT = 2
@classmethod
def CustomColumn(cls):
return Column(Integer, default=DEFAULT)
...
field1 = CustomColumn()
Python complained 'classmethod object is not callable' on the last line above.
Next I tried changing that line to:
field1 = Table.CustomColumn()
Now Python complained 'Table' is not defined
If I leave the @classmethod decroator off, I couldn't figure out how to
reference the class level data DEFAULT.
Python complained on the return Column(... line ' global name DEFAULT is not
defined.
What I finally ended up with that works is:
class Table(Base):
...
DEFAULT = 2
def CustomColumn(default=DEFAULT):
return Column(Integer, default=default)
...
field1 = CustomColumn()
Mark
--
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.