mock is on the way out as a general use tool.
Gregg Lind wrote: > > You got me there! Updating the FAQ on it would fix the issue for others. > > For reference: > > ########################## > from sqlalchemy import * > from sqlalchemy.schema import DDL > from sqlalchemy.ext.declarative import declarative_base > > Base = declarative_base() > > class Data(Base): > __tablename__ = 'data' > f1 = Column(Integer, nullable=False, primary_key=True) > f2 = Column(Integer, nullable=False, primary_key=True) > > DDL(r''' ''', on="postgres").execute_at('after-create',Data.__table__) > > > def print_schema_wrong(db): > from StringIO import StringIO > buf = StringIO() > engine = create_engine('%s://' % db, strategy='mock', > executor=lambda s, p='': buf.write(s + p)) > #meta = MetaData() > meta = Base.metadata > meta.create_all(engine) > print buf.getvalue() > > > def print_schema(db): > from StringIO import StringIO > buf = StringIO() > engine = create_engine('%s://' % db, strategy='mock', > executor=lambda s, p='': buf.write(str(s) + p)) > #meta = MetaData() > meta = Base.metadata > meta.create_all(engine) > print buf.getvalue() > > > # fine > print_schema('sqlite') > print_schema('postgres') > print_schema_wrong('sqlite') > > # will throw an error > print_schema_wrong('postgres') > > ######################33 > > > On Fri, May 29, 2009 at 3:46 PM, Michael Bayer <mike...@zzzcomputing.com> > wrote: >> >> 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 -~----------~----~----~----~------~----~------~--~---