I see a problem, and is that is being enum as field type and the
correct should be:

1- Indicate the field type
2- (Optional for fields of type integer and text)
Indicate options for that field type

Example:
GENDER_CHOICES = (
        ('M', 'Male'),
        ('F', 'Female'),
    )

has_field('gender', String(1), choices=GENDER_CHOICES)

On 19 jul, 21:24, Ted Pollari <[EMAIL PROTECTED]> wrote:
> On Jul 19, 2007, at 3:05 PM, Jacques Naude wrote:
>
> > Having tried Django some time ago, I already had a set of such
> > tuple constants, which I wanted to simply reuse in Elixir. I did
> > think that an enum column type in Elixir would be very handy (like
> > a tried in a version using SQLObject) to have though. One can
> > probably pick it up from the lower SQLAlchemy somehow, but I have
> > no idea how to tackle it at that level without going the whole
> > SQLAlchemy route, which I didn't - I reallt like the look and feel
> > of Elixir.
>
> I have no idea if I'm on a daft path with this -- I'm very new to
> Elixir and SA -- well, new to enlightened DB programming in any real
> sense...up to this point, I've used DB's only as simple, persistent
> data stores with nothing fancy and no real smarts to the
> implementation, so like I said, I don't know if I'm doing something
> silly, but here's what I do...
>
> We're starting to work on a project with Elixir where we'll need enum
> types like MySQL has (I've used MySQL a bit for other work, so I got
> used to using enum cols)... so this is what I came up with, cobbled
> together primarily from an SA recipe I found out on the web (in other
> words, I take little credit for it, but am glad to share if it's
> useful)...
>
> #############
> """enum.py"""
>
> from elixir import *
> from sqlalchemy import types
>
> class Enum(TypeDecorator):
>      """This class adds support for ENUM fields, similar in
> functionality to the
>      ENUM column type in MySQL"""
>
>      impl = types.Unicode
>      def __init__(self, values, empty_to_none=False):
>          '''
>          contruct an Enum type
>
>          values : a list of values that are valid for this column
>          empty_to_none : treat the empty string '' as None
>          '''
>          if values is None or len(values) is 0:
>              raise exceptions.AssertionError('Enum requires a list of
> values')
>          self.empty_to_none = empty_to_none
>          self.values = values
>          # the length of the string/unicode column should be the
> longest string
>          # in values
>          size = max([len(v) for v in values if v is not None])
>          super(Enum, self).__init__(size)
>
>      def convert_bind_param(self, value, engine):
>          if self.empty_to_none and value is '':
>              value = None
>          if value not in self.values:
>              raise AssertionError('"%s" not in Enum.values' % value)
>
>          return super(Enum, self).convert_bind_param(value, engine)
>
>      def convert_result_value(self, value, engine):
>          if value not in self.values:
>              raise AssertionError('"%s" not in Enum.values' % value)
>
>          return super(Enum, self).convert_result_value(value, engine)
>
> #############
>
> and then a test to show that it'll fail if you try to use something
> not in it's values list:
>
> #############
> """test_enum.py"""
>
> from sqlalchemy import create_engine
> from enum import *
>
> engine = create_engine('sqlite:///')
> metadata.connect(engine)
>
> def test_enum():
>      class TestPerson(Entity):
>
>          with_fields(
>              gender = Field(Enum(["m","f"])))
>
>      create_all()
>
>      t = TestPerson()
>      t.gender = "m"
>      objectstore.flush()
>      t.gender = "f"
>      objectstore.flush()
>
>      try:
>          t.gender = "W"  #this should fail
>          objectstore.flush()
>      except AssertionError:
>          pass
>      else:
>          assert False  #make sure this fails if it doesn't raise the
> exception above
>
>      drop_all()
>      objectstore.clear()
>
> #############
>
> Is that Elixir friendly enough for your needs or have I completely
> missed the boat here?
>
> -ted


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"SQLElixir" 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/sqlelixir?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to