Pandas 错误地推断出 cx_oracle 游标数据类型

Pandas incorrectly infers cx_oracle cursor datatype

我必须从 oracle 数据库中获取数据。

pandas.read_sql 太慢了,所以我转而使用 cx_oracle 游标。

以下代码正确检索了数据和列名,不幸的是推断的数据类型是错误的(对于数字)。

import pandas as pd
import cx_oracle as cx
import sqlalchemy as sa

conn = engine.raw_connection()
cursor = conn.cursor()
cursor.prefetchrows = 1000
cursor.arraysize = 100000
df = pd.DataFrame(cursor.execute(sqlQuery).fetchall(),
columns = [row[0] for row in cursor.description])

我知道数据类型存储在 cursor.description 中,但我不确定如何从那里正确检索它。

以下不能直接用于声明 pandas 中的列数据类型:

dtype = [row[1] for row in cursor.description]

输出如下所示:

[<cx_Oracle.DbType DB_TYPE_VARCHAR>,
 <cx_Oracle.DbType DB_TYPE_NUMBER>,
 <cx_Oracle.DbType DB_TYPE_VARCHAR>,
 <cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
 <cx_Oracle.DbType DB_TYPE_NUMBER>, # Pandas infers this as object
 <cx_Oracle.DbType DB_TYPE_DATE>]

那么,如何正确检索列的数据类型?

很明显,我的最终 objective 是简单地从 Oracle 数据库中获取并解析为 pandas 数据框,其中包括列名和正确的数据类型。 欢迎提出更好的方法。

我是这样解决的:

## fetch db dtypes
dtype_db = [row[1] for row in cursor.description]

for idx, default_type in enumerate(dtype_db):
    if  (default_type == cx_Oracle.DB_TYPE_NUMBER) & 
               (df[df.columns[idx]].dtype=='object'):
        df[df.columns[idx]] = df[df.columns[idx]].astype(float)