Chris Withers wrote: > Michael Bayer wrote: >> Chris Withers wrote: >>> Michael Bayer wrote: >>>>> Has anyone (hi, list, talking to you too!) already done a custom type >>>>> for this specific problem? >>>> people do custom types for all sorts of things. In the case of the >>>> Decimal here I'd likely subclass sqlalchemy.databases.sqlite.SLNumeric >>>> which should ensure that your own bind_processor() and >>>> result_processor() >>>> methods can be called. >>> Okay, but how do I make sure this is only used when sqlite this the >>> engine? >> >> You can use a TypeDecorator to switch between implementations. I had a >> plan to add a pre-fab type for this to core that allows easy switching >> of >> implementations. > > Okay, this is what I've ended up with for this one: > > from decimal import Decimal > from sqlalchemy import types > from sqlalchemy.databases.sqlite import SQLiteDialect > > class Numeric(types.TypeDecorator): > """A numeric type that respects precision with SQLite > > - always returns Decimals > - always rounds as necessary as a result > """ > > impl = types.Numeric > > def bind_processor(self, dialect): > if isinstance(dialect,SQLiteDialect): > def process(value): > if value is None: > return None > else: > return float(value) > return process > else: > return super(Numeric,self).bind_processor(dialect) > > def result_processor(self, dialect): > if isinstance(dialect,SQLiteDialect): > fstring = "%%.%df" % self.impl.scale > def process(value): > if value is None: > return None > else: > return Decimal(fstring % value) > return process > else: > return super(Numeric,self).result_processor(dialect) > > What should I have done differently and why? > > cheers, > > Chris > > PS: While looking into how to do this for 0.5.8, I saw this dire warning > in 0.6: > > util.warn("Dialect %s+%s does *not* support Decimal objects natively, " > "and SQLAlchemy must convert from floating point - " > "rounding errors and other issues may occur. " > "Please consider storing Decimal numbers as strings or " > "integers on this platform for lossless storage." % > (dialect.name, dialect.driver)) > > ...which I also saw applies to SQLite. > > What are the "rounding errors and others issues" that you allude to? > What is the integer/string recommendation saying? Use a String column? > Use an Integer column? Is this something I could work into a > TypeDecorator? Should I?
the whole ugly discussion is at http://www.sqlalchemy.org/trac/ticket/1759 > > cheers, > > Chris > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@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. > > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.