On Aug 31, 2010, at 8:51 PM, Petr Kobalíček wrote:

> 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.

Its not the best way since the creation sequence runs on a single connection, 
which could potentially be on a single transaction.    Working with "bind" 
pulls you out of that state which would be problematic if you were using 
transactions on a transactional DDL backend like Postgresql.





> 
> 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.
> 

-- 
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