Gregg Lind wrote: > > 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__)
didnt realize you're printing with mock. its: buf.write(str(s) + p) > > > > 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 -~----------~----~----~----~------~----~------~--~---