the issue is, the "deferrable" flag on FK generates the keyword on SQLite 
during DDL and is not accepted by SQLite ?  seems like we'd just get the SQLite 
dialect to not render that keyword (i.e. should be core behavior).   Also as a 
workaround  you could possibly use a @compiles("sqlite") on CreateConstraint...

(I seem to have missed this thread early on sorry for that !)


On Sep 27, 2011, at 6:04 PM, Wichert Akkerman wrote:

> I hate to do this kind of thing, but I haven't gotten any feedback on this 
> and I would love to hear some feedback/opinions. How do other people handle 
> deferrable constraints?
> 
> 
> On 2011-9-14 13:59, Wichert Akkerman wrote:
>> On 09/14/2011 12:25 PM, Wichert Akkerman wrote:
>>> Constraints marked as deferrable result in a syntax error when using
>>> SQLite. Is this deliberate, or a bug in the sqlite dialect?
>> 
>> As a workaround I figured I could use events to only add deferrable
>> constraint variants on PostgreSQL and use the non-deferrable version on
>> other database. That resulted in this code:
>> 
>> _generic_constraints = [UniqueConstraint('article_id', 'colour, 'size')]
>> _ deferrable_variant_constraints = [
>> UniqueConstraint('article_id', 'uuid', deferrable=True,
>> initially='DEFERRED'),
>> ]
>> 
>> class Article(BaseObject):
>> __table_args = (_generic_constraints[0], _deferrable_constraints[0], {})
>> 
>> def deferrable_supported(ddl, target, bind, **kw):
>> """Check if deferrable constraints are supported.
>> 
>> This function can be used as a callable for
>> :ref:`execute_if<sqlalchemy:sqlalchemy.schema.DDLElement.execute_if>` to
>> only run DDL statements on databases that support deferrable constraints.
>> """
>> return bind.dialect == 'postgresql'
>> 
>> 
>> def deferrable_not_supported(ddl, target, bind, **kw):
>> """Check if deferrable constraints are not supported.
>> 
>> This function can be used as a callable for
>> :ref:`execute_if<sqlalchemy:sqlalchemy.schema.DDLElement.execute_if>` to
>> only run DDL statements on databases that do not support deferrable
>> constraints.
>> """
>> return not deferrable_supported(ddl, target, bind, **kw)
>> 
>> for constraint in _generic_variant_constraints:
>> listen(Article.__table__, 'after_create',
>> AddConstraint(constraint)
>> .execute_if(callable_=deferrable_not_supported))
>> 
>> for constraint in _deferrable_variant_constraints:
>> listen(Article.__table__, 'after_create',
>> AddConstraint(constraint)
>> .execute_if(callable_=deferrable_supported))
>> 
>> 
>> 
>> But this fails as well since SQLite does not support ALTER TABLE .. ADD
>> CONSTRAINT. Is there another way to create deferrable constraints only
>> on databases that support it?
>> 
>> Wichert.
>> 
>> 
>> 
> 
> 
> -- 
> Wichert Akkerman <[email protected]>   It is simple to make things.
> http://www.wiggy.net/                  It is hard to make things simple.
> 
> -- 
> 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.
> 

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

Reply via email to