On Feb 26, 2010, at 8:50 AM, Chris Withers wrote:

> Michael Bayer wrote:
>> not sure if this is obvious, its the sqlite3.PARSE_DECLTYPES.  The
>> SQLite date types don't expect this to be turned on.  That is a
>> handy feature which I'm not sure was available in such a simple form
>> when I first wrote against the pysqlite dialect in Python 2.3.
> 
> Indeed, the dates are the problem here. As we talked about at PyCon, the 
> dates thing is a side effect of the thing my colleagues were trying to solve. 
> I've attached a test case which demonstrates the problem.

ah sorry, didnt see the test case.    you don't need SQLite converters for 
this, you need a custom type for now until we fix that issue.  ticket is 
forthcoming.





> 
> The test can be made to parse by adding the following:
> 
> import sqlite3
> sqlite3.register_converter('NUMERIC',Decimal)
> 
> ...and creating the engine as follows:
> 
> engine = create_engine(
>    "sqlite://",
>    connect_args = {'detect_types':sqlite3.PARSE_DECLTYPES}
>    )
> 
> ..but then we have the problem that my original mail was about. Any other 
> solutions or explanations on the truncating Decimals front?
> 
>> A workaround is to use a "dummy" Date type that returns None for
>> bind_processor() and result_processor().
> 
> Not gonna fly here, there's too many projects and developers this would touch 
> :'(
> 
>> I don't see any accessor on the SQLite connection that could tell us
>> if this flag is enabled.  We don't want to do an isinstance()
>> because those are quite expensive.
>> 
> 
>> So what we can do here is utilize 0.6's "test the connection" trick,
>> to issue a "select current_timestamp()" from the SQLite connection,
>> and if it comes back as datetime we'd assume PARSE_DECLTYPES is on,
>> or at least some kind of date-based processor has been added.  then
>> the SQLite date types would consult this flag.  I added #1685 for
>> this which is tentatively targeted at 0.6.0 just so I dont lose
>> track of it.
> 
> It sounds a bit icky, but I guess if there's no other way?
> 
>> We might want to look into having 0.6 set a default handler for date
>> types in any case, would need to ensure its completely compatible
>> with what we're doing now.
> 
> I dunno what this means...
> 
>> Also not sure if you're aware, "pool_recycle" is not advisable with
>> a :memory: database.  it would zap out your DB.  sqlite also doesnt
>> require any "encoding" since it only accepts unicode strings - the
>> param is unused by SQLalchemy with sqlite.
> 
> Yeah, both of these are there 'cos we swap out testing engine between MySQL 
> and SQLite, I'll make sure they're only passed when we're really using 
> MySQL...
> 
> cheers,
> 
> Chris
> 
> -- 
> Simplistix - Content Management, Batch Processing & Python Consulting
>            - http://www.simplistix.co.uk
> from sqlalchemy import create_engine
> from sqlalchemy.orm import sessionmaker
> from sqlalchemy.orm.session import Session
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy.schema import Column
> from sqlalchemy.types import String, Numeric, Integer
> 
> import unittest
> from decimal import Decimal
> 
> class Test(unittest.TestCase):
> 
>    def test_truncate(self):
>        # setup
>        engine = create_engine("sqlite://")
>        self.Session = sessionmaker(
>            bind=engine,
>            autoflush=True,
>            autocommit=False
>            )
>        Base = declarative_base(bind=engine)
>        class MyModel(Base):
>            __tablename__ = 'test'
>            id = Column(Integer, primary_key=True)
>            value = Column(Numeric(precision=36,scale=12))
>        Base.metadata.create_all()
>        session = self.Session()
> 
>        # precision=36 scale=12 should mean this can handle 12 decimal places
>        # and this has 12 decimal places.
>        session.add(MyModel(value="152.737826714556"))
>        session.commit()
> 
>        obj = session.query(MyModel).one()
> 
>        # this will fail with the output, it shouldn't
>        # Decimal("152.737826715") != Decimal("152.737826714556")
>        self.assertEqual(obj.value, Decimal("152.737826714556"))
> -- 
> 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.

Reply via email to