I used the DDL style

DDL('''ALTER TABLE data ADD CONSTRAINT lowername_check  CHECK
(lowername !~ '[[\:upper\:]]')''',
        on="postgres").execute_at('after-create',Data.__table__)

and now my "print_schema" method (based on
http://www.sqlalchemy.org/trac/wiki/FAQ#HowcanIgettheCREATETABLEDROPTABLEoutputasastring)
 breaks (on PG only, because of the DDL), with this error:

TypeError: unsupported operand type(s) for +: '_TextClause' and 'str'

I escaped the colons in the DDL.   Workarounds?

Gregg


Code:

def print_schema(T="postgres"):
    ''' print print_schema will print the schema in use '''
    global Base
    from StringIO import StringIO
    buf = StringIO()
    print '%s://' % T
    engine = create_engine('%s://' % T, strategy='mock',
executor=lambda s, p='': buf.write(s + p))
    Base.metadata.create_all(engine)
    return buf.getvalue()



On Fri, May 29, 2009 at 12:27 PM, Gregg Lind <gregg.l...@gmail.com> wrote:
> As always, thank you for the complete, exhaustive answer.  This
> particular thing is definitely and edge case, and rather non-obvious,
> so thank you for walking me through it.
>
> Either of those are clean enough for me!
>
> Is there are more proper / general way to describe the problem, so
> google and make this answer easier to find?
>
> Gregg
>
>
>
> On Fri, May 29, 2009 at 12:10 PM, Michael Bayer
> <mike...@zzzcomputing.com> wrote:
>>
>> Gregg Lind wrote:
>>>
>>> I use declarative base for defining classes.
>>>
>>> I have a constraint that only works in Postgres.  How do I declare
>>> that constraint "lowername_check" only if the session is going
>>> postgres (and not to sqlite, for example).
>>>
>>> pg_only_constraint = CheckConstraint("lowername !~
>>> '[[:upper:]]'",name='lowername_check'),
>>> class Data(Base):
>>>     __tablename__ = 'Data'
>>>     lowername=Column(Unicode, nullable=False)
>>>     __table_args__ = (
>>>         pg_only_constraint,  {}
>>>         )
>>
>>
>>
>> The cleanest way is to use the schema.DDL() construct which can filter
>> against various backends, but requires that you spell out the constraint
>> explicitly:
>>
>> DDL("CREATE CONSTRAINT ....", on="postgres").execute_at('after-create',
>> Data.__table__)
>>
>> Alternatively, if you want to stick with the CheckConstraint object you
>> can create a function "create_pg_constraints()" which is called at the
>> point your app calls "create_engine()", that contains all PG specific
>> constructs - the function would be called based on engine.dialect.name ==
>> "postgres".
>>
>> We have a more flexible architecture in 0.6 for this sort of thing and I
>> think if we add an AddConstraint() construct there and also move most of
>> DDL()'s execute-at and "on" functionality into the base DDLElement class,
>> that would enable both constructs to be combined together as in
>> AddConstraint(CheckConstraint(...args...),
>> on="postgres")).execute_at('after-create', Data.__table__).
>>
>>
>>
>>>
>>>
>>> Thanks!
>>>
>>> Gregg Lind
>>>
>>> >
>>>
>>
>>
>> >>
>>
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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