17
from sqlalchemy import create_engine, MetaData, ForeignKey

engine = create_engine("mysql://user:passwd@localhost/shema", echo=False)
meta = MetaData(engine, True)
conn = engine.connect()

tb_list = meta.tables["tb_list"]
tb_data = meta.tables["tb_data"]

tb_list.c.i_data.append_foreign_key( ForeignKey(tb_data.c.i_id) )

q = tb_list.outerjoin(tb_data).select()

res = conn.execute(q)

And now, how can I get columns type of query result res

One of decisions:

res._key_cache[ col_name ][0]

Do you know something else ?

user272432
  • 173
  • 1
  • 1
  • 5

1 Answers1

19

you'd say:

types = [col.type for col in q.columns]

the (compiled) statement is on the result too if you feel like digging:

types = [col.type for col in res.context.compiled.statement.columns]

if you want the DBAPI version of the types, which is a little more varied based on DBAPI:

types = [elem[1] for elem in res.cursor.description]

maybe we'll look into adding this kind of metadata more directly to the ResultProxy.

zzzeek
  • 72,307
  • 23
  • 193
  • 185
  • 1
    Is it true that you need to do a vendor-specific lookup to get the actual data types? e.g. in Postgres, `TYPES[res.context.cursor.description.type_code]`, where `TYPES` is a mapping of [Postgres type OIDs](http://initd.org/psycopg/docs/advanced.html#type-casting-from-sql-to-python)? – z0r Oct 14 '15 at 23:13
  • @z0r in psycopg2, those values might be the objects themselves. psycopg2's objects I think evaluate as integers or something like that, try it out. – zzzeek Oct 15 '15 at 13:12