the short answer is that DOUBLE is doing a Decimal conversion here and that’s 
where the digits are being lost.

So fix the problem immediately using asdecimal=False, then also make sure you 
use repr() to print out your type as str() for Python floats also truncates:

class SomeClass(Base):
   __tablename__ = 'someclass'
   id = Column(Integer, primary_key=True)
   value = Column(DOUBLE(asdecimal=False))

x = s.query(SomeClass).get(1)
print repr(x.value)

longer answer, I was a bit surprised that DOUBLE has asdecimal=True by default, 
but OK, but in any case I was surprised to see that SQLAlchemy’s Float type 
hardcodes the number of digits to 10 when it converts from float to Decimal, 
this will be fixed in 0.9 using the patch up at 
http://www.sqlalchemy.org/trac/attachment/ticket/2867/.

If you do want Decimal objects back in this case with DOUBLE, I’d subclass 
mysql.DOUBLE and specify a new result_processor() method.





On Nov 20, 2013, at 7:00 AM, Sebastian Elsner <sebast...@risefx.com> wrote:

> Hello,
> 
> I am inserting float data into a MySQL column of type DOUBLE. The data gets 
> inserted properly (verified via mysql terminal). Querying for the object 
> returns a Decimal object, but  the number of digits after the decimal point 
> if always limited to 11 (while DOUBLE supports 15 by default). So, what can I 
> do to get the correct value? I have played with the precision and scale 
> arguments for DOUBLE without effect.
> 
> Here's an example:
> 
> 
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.engine import create_engine
> from sqlalchemy.orm.session import sessionmaker
> from sqlalchemy.schema import Column
> from sqlalchemy.types import Integer
> 
> from sqlalchemy.dialects.mysql.base import DOUBLE
> 
> Base = declarative_base()
> 
> 
> class SomeClass(Base):
>    __tablename__ = 'someclass'
>    id = Column(Integer, primary_key=True)
>    value = Column(DOUBLE)
> 
> engine = create_engine('mysql://user:pass@localhost/test', echo=True)
> Base.metadata.create_all(engine)
> s = sessionmaker(engine)()
> r = SomeClass(value=0.1234567891234567)
> s.add(r)
> s.commit()
> x = s.query(SomeClass).get(1)
> print x.value
> 
> Regards
> 
> Sebastian
> 
> -- 
> check out www.pointcloud9.com
> 
> Sebastian Elsner - Pipeline Technical Director - RISE
> 
> t: +49 30 20180300 flor...@risefx.com
> f: +49 30 61651074 www.risefx.com
> 
> RISE FX GmbH
> Schlesische Strasse 28, Aufgang B, 10997 Berlin
> c/o action concept, An der Hasenkaule 1-7, 50354 Hürth
> Geschaeftsfuehrer: Sven Pannicke, Robert Pinnow
> Handelsregister Berlin HRB 106667 B
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to sqlalchemy+unsubscr...@googlegroups.com.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/groups/opt_out.

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to