Python 3.x 将Oracle数据类型转换为SQLAlchemy类型

Python 3.x 将Oracle数据类型转换为SQLAlchemy类型,python-3.x,oracle,sqlalchemy,sqldatatypes,Python 3.x,Oracle,Sqlalchemy,Sqldatatypes,我有一个oracle数据类型列表(数百个),我希望通过编程将其映射到SQLAlchemy数据类型 oracle数据类型示例(包括许多其他数据类型)包括: 我正在将oracle中的数据查询到pandas数据框中,然后使用sql alchemy将该数据加载到另一个系统。但是,我需要指定目标系统中的目标数据类型。(由于ETL过程正在批处理,仅使用dataframe默认值不起作用;第一批值可能会“误导”数据类型。) 是SQLAlchemy数据类型的列表,我需要将oracle数据类型映射到SQLAlche

我有一个oracle数据类型列表(数百个),我希望通过编程将其映射到SQLAlchemy数据类型

oracle数据类型示例(包括许多其他数据类型)包括:

我正在将oracle中的数据查询到pandas数据框中,然后使用sql alchemy将该数据加载到另一个系统。但是,我需要指定目标系统中的目标数据类型。(由于ETL过程正在批处理,仅使用dataframe默认值不起作用;第一批值可能会“误导”数据类型。)

是SQLAlchemy数据类型的列表,我需要将oracle数据类型映射到SQLAlchemy数据类型。除了手工构建这样一个字典之外,还有其他优雅的方法吗

编辑:我给出的具体示例数据类型并不重要。我宁愿通过编程和动态方式将Oracle中的任意列分配给正确的SQLAlchemy数据类型。数据类型是对的响应

SELECT
    DISTINCT data_type
FROM
    all_tab_columns;
SELECT DISTINCT data_type FROM all_tab_columns;
返回的值超过150个。因此,我真的希望避免手动查找每一项的文档。

  • XMLTYPE
    数据类型具有
    getStringVal
    getClobVal
    方法(取决于内容的长度),您可以使用这些方法提取XML内容,这些内容只是一个字符串值,可以使用(在调用
    getClobVal
    方法之后)

  • VARCHAR2
    只是一个可变长度的字符串。Oracle没有
    VARCHAR
    数据类型,这是它的等效数据类型(而
    VARCHAR
    目前是
    VARCHAR2
    的同义词)。等价物是

  • 记录为:

    数据库中的每一行都有一个地址。但是,某些表的行的地址不是物理的或永久的,或者不是由Oracle数据库生成的。例如,索引组织表的行地址存储在索引叶中,索引叶可以移动。外部表(例如通过网关访问的DB2表)的rowid不是标准的Oracle rowid

    Oracle使用通用行ID(urowids)存储索引组织的表和外部表的地址。索引组织的表具有逻辑UROWID,外部表具有外部UROWID。这两种类型的urowid都存储在
    ROWID
    pseudocolumn中(堆组织表的物理ROWID也是如此)

    UROWID
    持久保存在数据库之外是没有意义的,因为它所表示的数据可能不是永久的,并且可能会移动,即使它不移动,也只表示内存位置,而不是任何实际数据

  • 表示另一个资源的
    URI
    ,您可以使用它的
    getURL
    方法来获取它所表示的URI,它应该只是一个字符串值。等效的数据类型应该是或(在调用
    getURL
    方法以获取字符串表示形式之后)

  • 未定义
    不是数据类型。您应该检查是否有人创建了名为
    UNDEFINED
    的用户定义类型

  • 时间戳(9)
    只是一个
    时间戳
    ,精度为
    9
    十进制秒数。从文档中可以看出,这是您想要的


数据类型是对的响应

SELECT
    DISTINCT data_type
FROM
    all_tab_columns;
SELECT DISTINCT data_type FROM all_tab_columns;
请不要依赖此列表,因为它包括
*SYS
架构的表中使用的所有数据类型,您不应该接触这些表中的大多数,因为更改它们可能会产生不可预见的后果(包括使数据库不可用)

这些数据类型中的大多数将是数据库内部工作中使用的私有数据类型;您可以确定它们,因为它们通常在类型名称中有一个
$
。下一个最常见的分组是SDO几何体数据类型,这些数据类型都有
SDO\uu
前缀

因此,如果您的查询变成:

选择案例
当数据类型为“%$%”时,则为“私有类型”
当数据类型为“SDO%”时,则为“SDO几何体类型”
ELSE数据类型
以数据类型结束,
计数(不同的数据类型)为num\u实例
从所有_选项卡_列
分组
案例
当数据类型为“%$%”时,则为“私有类型”
当数据类型为“SDO%”时,则为“SDO几何体类型”
ELSE数据类型
结束
按数量实例描述、数据类型ASC排序;
然后,在一个dbfiddle上,您将获得此输出,其中没有用户生成的表(因此仅适用于系统生成的表):

产出:

返回零行和:

CREATE TABLE_NAME(id未定义);
引发异常
ORA-00902:无效数据类型


如何更好地确定您使用的类型?只需查看您创建的模式:

选择不同的所有者、数据类型
从所有_选项卡_列
其中所有者位于('USER1'、'USER2'、'USER3')
然后您就知道这些数据类型是用户创建的表中正在使用的数据类型。您应该发现,除非您正在做一些深奥的事情,否则您正在使用的大多数(如果不是全部)类型都将由SQLAlchemy进行本机处理


dbfiddle

您确定
未定义的
是一个?是非永久数据的
ROWID
伪列的数据类型(表示数据库内部的内存地址)。将其映射到数据库之外的东西是没有意义的,而只是表示URI的一种方式。这听起来像是减少了相关列的数量,然后手动映射它们可能就是答案。感谢您的信息反馈。 OWNER | TABLE_NAME | COLUMN_NAME | DATA_TYPE :----- | :---------------------------- | :-------------------- | :--------------- CTXSYS | CTX_USER_PENDING | PND_ROWID | ROWID CTXSYS | DRV$PENDING | PND_ROWID | ROWID CTXSYS | DRV$UNINDEXED | UNX_ROWID | ROWID CTXSYS | DRV$UNINDEXED2 | UNX_ROWID | ROWID CTXSYS | DRV$WAITING | WTG_ROWID | ROWID MDSYS | SDO_GR_MOSAIC_0 | RID | ROWID MDSYS | SDO_GR_MOSAIC_1 | RID | ROWID MDSYS | SDO_GR_MOSAIC_2 | RID | ROWID SYS | ALL_SCHEDULER_JOB_ARGS | ANYDATA_VALUE | ANYDATA SYS | ALL_SCHEDULER_PROGRAM_ARGS | DEFAULT_ANYDATA_VALUE | ANYDATA SYS | ALL_SQLSET_BINDS | VALUE | ANYDATA SYS | ALL_STREAMS_MESSAGE_CONSUMERS | NOTIFICATION_CONTEXT | ANYDATA SYS | ALL_SUMDELTA | HIGHROWID | ROWID SYS | ALL_SUMDELTA | LOWROWID | ROWID SYS | HS$_PARALLEL_METADATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS$_PARALLEL_METADATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_METADATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_METADATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | PARTITION_COL_TYPES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | PARTITION_COL_NAMES | HSBLKNAMLST SYS | HS_PARALLEL_PARTITION_DATA | HIGH_VALUE | HSBLKVALARY SYS | HS_PARALLEL_PARTITION_DATA | LOW_VALUE | HSBLKVALARY SYS | ORA_KGLR7_IDL_SB4 | PIECE | UNDEFINED SYS | ORA_KGLR7_IDL_UB2 | PIECE | UNDEFINED SYS | USER_COMPARISON_ROW_DIF | LOCAL_ROWID | ROWID SYS | USER_COMPARISON_ROW_DIF | REMOTE_ROWID | ROWID SYS | USER_PARALLEL_EXECUTE_CHUNKS | END_ROWID | ROWID SYS | USER_PARALLEL_EXECUTE_CHUNKS | START_ROWID | ROWID SYS | USER_SCHEDULER_JOB_ARGS | ANYDATA_VALUE | ANYDATA SYS | USER_SCHEDULER_PROGRAM_ARGS | DEFAULT_ANYDATA_VALUE | ANYDATA SYS | USER_SQLSET_BINDS | VALUE | ANYDATA SYS | USER_SQLTUNE_BINDS | VALUE | ANYDATA SYS | USER_SR_STLOG_EXCEPTIONS | BAD_ROWID | ROWID SYS | USER_SUBSCR_REGISTRATIONS | ANY_CONTEXT | ANYDATA SYS | _USER_COMPARISON_ROW_DIF | RMT_ROWID | ROWID SYS | _USER_COMPARISON_ROW_DIF | LOC_ROWID | ROWID SYS | _user_stat_varray | CL1 | DS_VARRAY_4_CLOB XDB | XDB$ROOT_INFO_V | RESOURCE_ROOT | ROWID