I solved everything by overriding against()

_DDL_MATCHER = re.compile(ur"\$\{(_\w+)\:{0,1}([^\}]*)\}")

class CustomDDL(DDL):
  def __init__(self, statement, on=None, context=None, bind=None):
    super(CustomDDL, self).__init__(statement, on, context, bind)

  def against(self, target):
    global _DDL_MATCHER
    def repl(match):
      func = match.group(1)
      args = match.group(2)
      return getattr(self, func)(target, args)
    return _DDL_MATCHER.sub(repl, self.statement);

This works for me.

I'm getting engine from target.metadata.bind and I hope that it's correct way.

On Wed, Sep 1, 2010 at 2:15 AM, Petr Kobalíček <kobalicek.p...@gmail.com> wrote:
> Hi,
>
> I have problem to understand which way should be used to write custom
> DDL class. I'm generating some stored procedures for my tables. The
> procedures are very similar and I'd like to use some generic way. Now
> I'm nearly done, but I need some way how to extract some information
> from table to use it in my DDL.
>
> I discovered that for this I need the engine where DDL runs.
>
> My custom class may look like this:
>
> class CustomDDL(DDL):
>  def against(self, target):
>    # Is this the method I should generate the DDL? How can I access
> engine from here?
>    self.target = target
>
> There is also possibility to create a __call__ method where the engine
> is, but I'm not sure if this is the right place.
>
> So my questions:
>
> - which method I should override to make my custom DDL substitution
> - do I need to base class on DDL or DDLElement? I can create my own,
> but I'm not sure if I can add it.
>
>
>
> Currently I'm using something like this to inject some triggers/functions:
>
> _DDL_MATCHER = re.compile(ur"\$\{(_\w+)\:{0,1}([^\}]*)\}")
>
> class CustomDDL(object):
>  def __init__(self, event, ddl):
>    self.event = event
>    self.ddl = ddl
>
>  def inject(self, table):
>    DDL(self.compile(table)).execute_at(self.event, table)
>
>  def compile(self, table):
>    global _DDL_MATCHER
>    def repl(match):
>      func = match.group(1)
>      args = match.group(2)
>      return getattr(self, func)(table, args)
>    return _DDL_MATCHER.sub(repl, self.ddl);
>
>  def _TABLE(self, table, args):
>    return table.name + args
>
>  def _PREPARE_DECLARATION(self, table, args):
>    result = u""
>    if hasattr(table, "area"):
>      for column in table.area:
>        #result += u"condition_" + unicode(column.name) + u" " + \
>        #  unicode(column.type.get_dbapi_type(engine.dialect.dbapi)) + u"; "
>        pass
>    return result
>
>  def _PREPARE_CONDITION(self, table, args):
>    return ""
>
>  def _WHERE(self, table, args):
>    if args:
>      return u"WHERE " + args
>    else:
>      return u""
>
> This works for me, except I need to access the engine.
>
> Thanks for any info about this
>
> Best regards
> Petr
>

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to