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.