我必须将来自各种数据库(Oracle和Postgre,目前)的一些数据转储到CSV文件中,同时保留列类型信息,以便可以将数据正确加载到另一个应用程序中。基本上,我需要编写一个函数,可以将列式数据中的字符串/数字数据与游标对象区分开来,其方式与所使用的特定DBAPI模块无关。
根据DB-API v2 docs,每个DBAPI模块必须定义类型对象(例如module.STRING
),其中“必须比较等于”每个列的游标对象中的类型对象(例如{{1}对于第n列)。
我遇到的问题是......如果我只有可以访问游标对象,我怎么能弄清楚这种比较的适当类型对象是什么?如何从游标对象获取相应DBAPI模块的句柄。有什么建议或意见吗?
到目前为止,我一直在使用丑陋的kludge:
cursor.description[n][1]
我想要一个更强大,更优雅的解决方案。有什么建议或意见吗?
编辑:到目前为止,我提出的最好的事情是使用以下几乎可怕的黑客来获取相应模块的句柄:
def FigureOutDBTypes(cursor):
if 'psycopg2' in str(type(cursor)):
coltypes = [(str if x[1]==1043 else int) for x in cursor.description]
elif 'Oracle' in str(type(cursor)):
typemap = dict(NUMBER = int,
DATE = int,
DATETIME = int,
TIMESTAMP = int,
STRING = str)
coltypes = [typemap.get(x[1] and x[1].__name__, int) for x in cursor.description]
else:
raise RuntimeError("Don't know how to get type information from DB cursor.", cursor)
return coltypes