Lycovian <[email protected]> wrote:

> I've got a mostly working custom dialect for Teradata (via ODBC).  One minor 
> issue though is that for func.count() queries the returned datatype is 
> Python's decimal.Decimal type.  The only real issue is that it looks "weird", 
> to me at least.  Is this behavior expected?  

COUNT should typically return an integer but these values often get munged in 
the driver translation.

> If I run the equivalent query in PyODBC the resulting field type is int so I 
> am guessing that SA is marshalling this to decimal.Decimal somewhere.

Normally that shouldn’t be happening.    We have a “count” stub for this 
function and its return type is Integer.  So maybe there’s an Integer 
implementation happening.

We had an issue like this with Oracle, which was because we had to inject type 
handlers into cx_oracle which couldn’t reliably discern between integer and 
decimal.



>  If not is there something I should be doing in my custom dialect to marshal 
> func.count() -> int?
> 
> etl@ichabod:~/src/etl/sqlalchemy_teradata$ python simple.py
> [(Decimal('1'), 'ed'), (Decimal('1'), 'Foobar'), (Decimal('1'), 'Mike')]
> rs[0]: (Decimal('1'), 'ed'), type(rs[0][0]): <class 'decimal.Decimal'>
> 
> <snip: simple.py>
> import sqlalchemy
> from sqlalchemy.dialects import registry
> from sqlalchemy import create_engine, MetaData
> from sqlalchemy.ext.declarative import declarative_base
> from sqlalchemy import Column, func
> from sqlalchemy.orm import sessionmaker
> 
> registry.register("teradata", "sqlalchemy_teradata.pyodbc", 
> "TeradataDialect_pyodbc")
> 
> engine = sqlalchemy.create_engine("teradata://td_testsqlatd")
> conn = engine.connect()
> 
> metadata = MetaData(schema='testsqlatd')
> Base = declarative_base(bind=metadata)
> 
> class TestUser(Base):
>     __tablename__ = 'test_user'
> 
>     id = Column(sqlalchemy.Integer, primary_key=True)
>     name = Column(sqlalchemy.String(50), nullable=False)
>     fullname = Column(sqlalchemy.String(50))
>     pwd = Column(sqlalchemy.String(50))
> 
>     def __repr__(self):
>         return "<TestUser(name='%s', fullname='%s', password='%s')>" % (
>             self.name, self.fullname, self.pwd)
> 
> Session = sessionmaker(bind=engine)
> session = Session()
> 
> first_name = 'ed'; _user1 = TestUser(name=first_name, fullname=('%s Jones' % 
> first_name.capitalize()), pwd='password')
> first_name = 'Mike'; _user2 = TestUser(name=first_name, fullname=('%s Jones' 
> % first_name.capitalize()), pwd='password')
> first_name = 'Foobar'; _user3 = TestUser(name=first_name, fullname=('%s 
> Jones' % first_name.capitalize()), pwd='password')
> 
> session.add_all([_user1, _user2, _user3])
> session.commit()
> 
> rs = session.query(func.count(TestUser.name), 
> TestUser.name).group_by(TestUser.name).all()
> print rs
> print "rs[0]: %s, type(rs[0][0]): %s" % (rs[0], type(rs[0][0]))
> </snip>
> 
> 
> 
> 
> 
> 
> 
> -- 
> 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 [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sqlalchemy.
> For more options, visit https://groups.google.com/d/optout.

-- 
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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to