Alas, that doesn't seem to matter or help.

Even this statement causes the same issue.  Odd.  Must not be related
to the colons, alas.

DDL(r''' ''', on="postgres").execute_at('after-create',Data.__table__)



On Fri, May 29, 2009 at 3:08 PM, Michael Bayer <mike...@zzzcomputing.com> wrote:
>
> Gregg Lind wrote:
>>
>> 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?
>
> escape them with \\: or use r'\:'
>
>
>>
>> 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